처음 시도한 코드
import numpy as np
import math
def solution(answers):
supoza1 = [1,2,3,4,5] * math.gcd(len(answers), 5)
supoza2 = [2,1,2,3,2,4,2,5] * math.gcd(len(answers), 8)
supoza3 = [3,3,1,1,2,2,4,4,5,5] * math.gcd(len(answers), 10)
supo = []
supo.append(sum(np.equal(answers, supoza1[:len(answers)])))
supo.append(sum(np.equal(answers, supoza2[:len(answers)])))
supo.append(sum(np.equal(answers, supoza3[:len(answers)])))
return sorted([i+1 for i in range(len(supo)) if max(supo) == supo[i]])
answers와 수포자 1,2,3의 정답을 각각 비교하기 위해 np.equal을 사용하였다.
하지만, answers의 길이는 최대 10,000이기 때문에 한 번에 answers와 수포자의 답을 비교하려면 런타임 에러가 발생한다.
코드
def solution(answers):
supoza1 = [1,2,3,4,5]
supoza2 = [2,1,2,3,2,4,2,5]
supoza3 = [3,3,1,1,2,2,4,4,5,5]
score = [0,0,0]
for i, v in enumerate(answers):
if v == supoza1[i % len(supoza1)]:
score[0] += 1 # 수포자 1
if v == supoza2[i % len(supoza2)]:
score[1] += 1 # 수포자 2
if v == supoza3[i % len(supoza3)]:
score[2] += 1 # 수포자 3
return sorted([i+1 for i in range(len(score)) if max(score) == score[i]])
어떻게 하면 답이 같은 지 비교할 수 있을지 생각하다 문제 유형이 완전탐색 문제로 들어가는 것을 보고 for문으로 하나씩 비교해 보아야겠다고 생각했다.
enumerate를 사용하여 answers의 인덱스와 값을 같이 불러와 해당 값이 supoza 1,2,3의 각 값과 같은 지 비교하여 정답이면 score를 +1씩 해주었다.
supoza보다 answers의 길이가 긴 경우에는 answers의 해당 인덱스(=i)를 각 supoza의 길이로 나눈 나머지를 찾으면 i와 같은 위치에 존재하는 답을 구할 수 있다.
왜냐하면, supoza는 계속 반복되는 패턴으로 답을 찍는다.
만약 supoza = [1,2,3,4,5]이고, answers=[1,2,3,4,5,6]이면 6번 문제(=5번 인덱스)는 supoza는 1(=0번 인덱스)로 찍는다.
answers의 5번 인덱스(=i)를 len(supoza)로 나눈 나머지인 5 % 5 = 0이 supoza가 찍는 답이 되는 것이다.
모든 문제에 대해 정답이 일치하는지 확인했으면, score에서 최댓값을 찾아 누가 가장 많은 답이 일치했는지 확인하면 된다.
리스트 컴프리헨션을 사용하여 max(score)와 같은 값을 가지는 인덱스를 찾아 오름차순으로 정렬한 리스트를 리턴하였다.