모의고사 문제 바로가기

나의 풀이

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]

출처