수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 함수를 작성해주세요.
[제한 조건]
- 시험은 최대 10,000 문제로 구성되어있습니다.
- 문제의 정답은 1, 2, 3, 4, 5중 하나입니다.
- 가장 높은 점수를 받은 사람이 여럿일 경우, return하는 값을 오름차순 정렬해주세요.
def solution(answers): answer = [] return answer
에서부터 시작.
답안으로 제출한 코드 풀이
def solution(answers):
answer = []
# return할 answer 리스트를 미리 선언해둔다
three = [[1, 2, 3, 4, 5],[2, 1, 2, 3, 2, 4, 2, 5],[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]]
# 수포자1, 2, 3의 답안 패턴을 리스트로 만든다. 이 때 리스트의 각 요소도 리스트로 들어간다.
count_list = []
# 각 수포자들의 답안과 실제 정답이 몇 개 일치하는지 세어 그 개수를 요소로 넣을 리스트도 선언한다.
for one in three:
# 수포자들의 답안을 for문으로 돌며,
i=0
j=0
count=0
while i<len(answers):
# 정답과 수포자들의 답안을 모두 비교하기 위한 while
if answers[i]==one[j]:
count+=1
# a-1) 정답과 수포자 한 명의 답안이 일치할 때마다 count를 하나씩 증가시킨다
i+=1
# a-2) i는 1씩 증가시킨다 (while문이므로 수동으로 그 다음 답을 체크할 수 있는 식을 써준 것)
if j==len(one)-1:
# 수포자 한 명의 답안 중 맨 마지막 답안에 접근하면
j=0
# j는 다시 0으로 초기화시킨다 --> j는 수포자 한 명의 답안 리스트의 인덱스이기에 그렇지 않으면 다시 비교할 수가 없음
else:
# 수포자 한 명의 답안 중 맨 마지막 답안이 아니라면
j+=1
# 그냥 그 다음 답으로 넘어간다
count_list.append(count)
# 미리 선언해둔 count_list 리스트에 count 변수를 append한다
# 이 모든 과정이 for one in three for문 속에 있기 때문에 세 번 반복되고, 따라서 count_list에는 세 개의 값이 존재하게 된다.
for i,v in enumerate(count_list):
# enumerate를 이용하여 count_list 리스트의 인덱스와 value값을 통째로(튜플 형태로) iterate할 수 있게 한다
if v == max(count_list):
# value값이 count_list의 최대값이면
answer.append(i+1)
# answer 리스트에 해당 value값의 index에 1을 더하여(index는 0부터 시작하기 때문) append해준다
return answer
# 최대값만이 append되어 있는 배열 answer를 리턴한다.
다른 프로그래머스 유저의 풀이 중 인상적인 풀이
def solution(answers):
il=[1, 2, 3, 4, 5]
i=[2, 1, 2, 3, 2, 4, 2, 5]
sam=[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
answer=[0,0,0]
# 이 코드가 신선했다. 수포자 1, 2, 3의 답안에서 정답과 일치하는 수를 적을 세 개의 공간을 answer 리스트에 미리 선언해둔 것.
for x in range(0,len(answers)):
# 정답을 처음부터 끝까지 모두 돌며
if il[x%5]==answers[x]:answer[0]+=1
# 이 부분도 좋은 접근이다. answers의 정확한 개수를 알수 없으니, mod를 이용하여 수포자의 답안을 mod를 이용하여 무한으로 접근할 수 있게한 것이다.
# 그리고 미리 선언해둔 answer 리스트의 요소에 인덱스로 접근하여 수포자의 답안과 정답이 같을 경우 해당 값을 +1해준다.
if i[x%8]==answers[x]:answer[1]+=1
if sam[x%10]==answers[x]:answer[2]+=1
mx=max(answer)
# 수포자들과 정답이 일치하는 수가 요소로 들어가있는 리스트 answer의 최대값을 mx로 미리 선언해둔다.
# 근데 여기서 한 명만 최대값으로 출력되는 법은 없다는 점을 잘 파악하여
# 아래 코드에 구현했다.
for x in range(3):
if answer[x] == mx:
answer.append(x+1)
# x+1을 append하는 이유는 인덱스이기 때문에 수포자 1은 0번 인덱스에, 수포자 2는 1번 인덱스에, 수포자 3은 2번 인덱스에 들어가있기 때문!
# 그리하여 정확히 N번째 수포자임을 리턴하기 위해 x+1로 answer 리스트의 맨 뒤에 append 시키는 것.
return answer[3:]
# answer[3:]이라 하여 answer 리스트의 인덱스 3번 즉 4번째 요소값부터 모두 출력되게 하였다. (이 방법이면 복수의 수포자도 리턴이 가능하다.)