나의 풀이
bruteforce
문제는 문제 이해만 잘 하면 솔직히 구현의 영역이다. PS에서 list을 다룰 때에 enumerate
가 굉장히 유용하고 자주 쓰이기에 잘 활용하는 것이 중요하다. 아래 풀이에서는 그냥 1, 2, 3번 학생의 찍는 번호를 a,b,c array로 만들고 하나씩 확인하는 방법을 택했다. score=[0,0,0]
으로 선언하고 각 자리에 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
score = [0,0,0]
for i, ans in enumerate(answers):
if a[i] == ans:
score[0] += 1
if b[i] == ans:
score[1] += 1
if c[i] == ans:
score[2] += 1
answer = []
for i, s in enumerate(score):
if s == max(score):
answer.append(i+1)
return answer
다른 사람의 풀이 구경하기
순환주기 고려해주기
pattern1[idx%len(pattern1)]
처럼 각각의 순환 주기로 index을 나누어주면 큰 숫자에 대해서도 정답을 구할 수 있다. a = [1,2,3,4,5]*2000
처럼 안해도 되어서 메모리 절약 가능!
Cycle 이용하기
cycle
이라는 기능은 처음 알게 되었다. next()
메소드로 다음 항목을 불러오는게 좋았다.
그나저나 giveups
이라는 변수명이라니 ㅋㅋㅋ 정말 기똥찬 아이디어같다.
from itertools import cycle
def solution(answers):
giveups = [
cycle([1,2,3,4,5]),
cycle([2,1,2,3,2,4,2,5]),
cycle([3,3,1,1,2,2,4,4,5,5]),
]
scores = [0, 0, 0]
for num in answers:
for i in range(3):
if next(giveups[i]) == num:
scores[i] += 1
highest = max(scores)
return [i + 1 for i, v in enumerate(scores) if v == highest]