문제

https://programmers.co.kr/learn/courses/30/lessons/42840?language=python3

풀이

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

지문이 웃겼던 문제

def solution(answers):
    s1 = [1,2,3,4,5] * -(-len(answers)//5)
    s2 = [2,1,2,3,2,4,2,5] * -(-len(answers)//8)
    s3 = [3,3,1,1,2,2,4,4,5,5] * -(-len(answers)//10)
    
    answer = [0, 0, 0]
    for i in range(len(answers)) :
        if answers[i] == s1[i] :
            answer[0] += 1
        if answers[i] == s2[i] :
            answer[1] += 1
        if answers[i] == s3[i] :
            answer[2] += 1
    
    return [i for i, a in enumerate(answer,start=1) if a==max(answer)]

음수로 나누고 올림처리 하던 그 풀이를 응용해봤다.
문제가 쉽다 했더니 레벨1이네…

더 나은 풀이

def solution(answers):
    p = [[1, 2, 3, 4, 5],
         [2, 1, 2, 3, 2, 4, 2, 5],
         [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]]
    s = [0] * len(p)

    for q, a in enumerate(answers):
        for i, v in enumerate(p):
            if a == v[q % len(v)]:
                s[i] += 1
    return [i + 1 for i, v in enumerate(s) if v == max(s)]

나머지 연산으로 문제를 비교하는 코드

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]

cycle함수를 이용해서 패턴을 만들고
이걸 next함수를 이용해서 패턴원소 중 하나를 가져온다.
가장 파이썬스럽게 푼 문제로 보인다.

댓글남기기