티스토리 뷰
728x90
[Python]프로그래머스 문제풀이 - 모의고사
서문
오늘은 프로그래머스 사이트 / 코딩테스트 / 완전탐색 부분 첫 번째 문제풀이를 하겠습니다. 문제를 살펴보겠습니다. 😉
- 프로그래머스 문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42840
코드의 전개 논리가 궁금하시다면, 밑의 사이트에 들어가서 코드를 작성하여 visualize해주시면 코드가 어떤 식으로 흘러가는지 눈으로 파악하실 수 있습니다!
- 파이썬 튜터 사이트 : http://pythontutor.com/visualize.html#mode=display
1. 문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.
2. 제한사항
- 시험은 최대 10,000 문제로 구성되어있습니다.
- 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
- 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.
3. 입출력 예 설명
answers | return |
---|---|
[1,2,3,4,5] | [1] |
[1,3,2,4,2] | [1,2,3] |
#1
- 수포자 1은 모든 문제를 맞혔습니다.
- 수포자 2는 모든 문제를 틀렸습니다.
- 수포자 3은 모든 문제를 틀렸습니다.
- 따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.
#2
- 모든 사람이 2문제씩을 맞췄습니다.
본문
요약
- 세 명이 자신만의 찍기 방법으로 문제를 찍는다.
- answers에 문제의 답이 주어진다.
- 가장 많이 맞춘 사람을 return해라 (각 사람은 순서대로 1,2,3)
문제풀이
코드
def solution(answers):
a = [1, 2, 3, 4, 5] * 2000
b = [2, 1, 2, 3, 2, 4, 2, 5] * 1250
c = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] * 1000
a_c = 0
b_c = 0
c_c = 0
final = []
for i in range(len(answers)):
if a[i] == answers[i]:
a_c += 1
if b[i] == answers[i]:
b_c += 1
if c[i] == answers[i]:
c_c += 1
final.extend([(1,a_c),(2,b_c),(3,c_c)])
final.sort(key=lambda x: x[1], reverse=True)
if final[0][1] > final[1][1]:
return [final[0][0]]
elif final[0][1] == final[1][1]:
return [final[0][0],final[1][0]]
elif final[0][1] == final[1][1] and final[1][1] == final[2][1]:
return [final[0][0],final[1][0],final[2][0]]
결과
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
Detail Code Review
- a,b,c의 문제 패턴이 존재한다. 제한사항에서 문제의 길이가 10,000이라고 한다. 이때 완전탐색을 사용할 방법이 무엇이 있을까? 나는 패턴을 문제의 길이와 같게 해준 다음 문제의 길이만큼 포문으로 탐색을 하려고 했다. 다른 방법으로는 a,b,c 패턴들을 각 각 한 번에 도는 방법이다. 그 동안 count를 해주면 된다.
- 문제를 돌면서 문제의 답과 세 명의 답들을 비교하고 같으면 count를 +=1 늘려준다
- 문제의 길이만큼 for문을 돌고 나면 각 사람의 정답 수가 구해진다. 그럼 list에 (순서, 카운트) 순으로 담는다.
- 카운트 순으로 정렬을 하는데 많이 맞춘 사람 순 (x[1], reverse=True) 으로 정렬한다.
- 만약 첫 번째 사람이 두 번째 사람보다 많이 맞추면 그 사람의 순서를 return한다.
- 만약 두 번째 사람과 첫 번째 사람의 정답수가 같으면 그 두 사람을 return한다.
- 만약 세 번째 사람까지 정답수가 같으면 3명을 순서대로 return한다.
혹시 문제가 있는 부분이 있으시면 말씀해주세요. 더 좋은 아이디어도 알려주시면 감사하겠습니다.😉
댓글