처음 내 풀이
def solution(answers):
f = [
1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4,
5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5
]
s = [
2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5,
2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5
]
t = [
3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1,
2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5
]
cnt = [0, 0, 0]
for i in range(len(answers)):
idx = i % 40
if f[idx] == answers[i]:
cnt[0] += 1
if s[idx] == answers[i]:
cnt[1] += 1
if t[idx] == answers[i]:
cnt[2] += 1
max_cnt = max(cnt)
answer = []
for i in range(len(cnt)):
if max_cnt == cnt[i]:
answer.append(i + 1)
return answer
...어쩌다 f, s, t를 이렇게 작성하게 되었냐면 나 포함 3명이 누가누가 빨리 푸나 대결을 하는 중이어서 일단 풀어야겠다는 생각만 했다.
answers와 f, s, t의 인덱스를 맞춰서 비교해야 한다는 생각으로
각각 f는 5개, s는 8개, t는 10개의 원소가 있었기 때문에
아 공배수. 40개로 맞추자.
그래서 answers의 인덱스를 40의 나머지로 나눠서 비교하자...
라는 생각과 함께 f, s, t의 원소를 40개 씩으로 통일했다.
그러고 카운트 리스트를 만들어 각 인덱스에 수포자 1,2,3(각 -1하면 인덱스임)이 맞힌 문제의 갯수를 저장했다.
그리고 그 중 가장 큰 수를 max_cnt에 저장 한 후,
카운트 리스트를 돌며 비교해서 가장 많이 맞춘 사람의 인덱스를 answer에 담아 리턴했다.
일단 문제는 빨리 풀었다. 그래서 기분은 좋았는데
저렇게 40개나 원소를 저장하는게 맞을까. 싶었고
만약 공배수를 얼른 찾을 수 없었다면...? 하면서 코드를 들여다 보니
개선의 여지가 보였다.
아래는 개선한 내용이다.
def solution(answers):
f = [1, 2, 3, 4, 5]
s = [2, 1, 2, 3, 2, 4, 2, 5]
t = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
cnt = [0]*3
for i, v in enumerate(answers):
if f[i%len(f)] == v :
cnt[0] += 1
if s[i%len(s)] == v :
cnt[1] += 1
if t[i%len(t)] == v :
cnt[2] += 1
answer = []
for i in range(len(cnt)):
if max(cnt) == cnt[i]:
answer.append(i+1)
return answer
자주 잊어버리는게 enumerate().
그리고 첫 답안을 작성할 때, 첫 번째 for문 안에 인덱스를 계산하는 부분에서
각각의 리스트마다 인덱스를 어떻게 넣어줘야할지 몰랐는데,
첫 답안을 보면서 생각하니 각각 넣어버리면 되는구나 하는 생각이 들었다.
나머지는 똑같다.
참고용으로 함께 문제를 푼 친구의 코드도 함께 적어놓겠다.
def solution(answers):
math_quitter1 = [1, 2, 3, 4, 5] # 5
math_quitter2 = [2, 1, 2, 3, 2, 4, 2, 5] # 8
math_quitter3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] # 10
students = [math_quitter1, math_quitter2, math_quitter3]
answer = []
for math_quitter in students:
cnt = 0
math_leng = len(math_quitter)
for i in range(len(answers)):
if answers[i] == math_quitter[i%math_leng]:
cnt += 1
answer.append(cnt)
best_grade = max(answer)
result = [ k+1 for k in range(len(answer)) if answer[k] == best_grade]
return result