[코드카타] 알고리즘 57번, 모의고사

양승우·2024년 11월 15일

코드카타

목록 보기
30/58

A57. 모의고사

문제

수포자들은 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.
1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...
1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

데이터 이해

수포자들은 일정한 패턴으로 답을 찍는다
그게 우연히 실제 답안(answers)와 일치하는 부분이 있어서 각자에게 점수가 배정될 예정

수포자 1번 : [1, 2, 3, 4, 5]를 반복 (len = 5)
수포자 2번 : [2, 1, 2, 3, 2, 4, 2, 5]를 반복 (len = 8)
수포자 3번 : [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]를 반복 (len = 10)

주어진 answers까지 돌렸을 때 얻은 점수가 가장 높은 수포자를 찾는 문제
이때, 동일한 점수가 둘 이상이라면 asc 정렬

풀이 과정

패턴을 반복하는 문제 풀이 방법

하나의 패턴이 여러번 반복되는 문제를 풀 때는 나머지를 통해서 그 패턴 내의 위치를 찾을 수 있다.
for-range를 돌리면서 i%5를 하면 5개짜리 literable값을 돌렸을 때 나오는 값을 찾을 수 있다

sp1 = [1, 2, 3, 4, 5]

-- num:   1 2 3 4 5 6 7 8 9 10
-- i%5:   1 2 3 4 0 1 2 3 4 0

-- value: 1 2 3 4 5 1 2 3 4 5

패턴 찾기

수호자 1번은 연속적인 숫자 배열로 이루어져 있기에 i%5로 쉽게 계산할 수 있었다
하지만 수포자 2번과 3번은 연속적인 숫자로 이루어져 있지 않아서 규칙성을 살려서 (ex. 홀수는 2, 짝수는 값에 따라 다른 return) 계산하기 어렵다.

사실 이번 문제 같은 경우에는 패턴 길이가 길지 않고, 그것에 뚜렷한 패턴이 드러나지도 않기 때문에 그냥 반복되는 값을 리스트로 넣어버리는 것이 수월하다.

sp1 = [1, 2, 3, 4, 5]
sp2 = [2, 1, 2, 3, 2, 4, 2, 5]
sp3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]

딕셔너리 value를 통해 key 찾기

dictionary.items()는 (key, value)를 반환한다
이를 for문과 연계하면 key와 value를 동시에 받을 수 있고,
이때 key 혹은 value에 조건을 걸면 그에 따라 원하는 값을 찾아낼 수 있다.

for k, v in sp_dict.items():
    if v == max(sp_dict.values()):
        answer.append(k)

최종 코드

최종적으로 아래와 같은 코드를 작성할 수 있다.
주의할 점은,
(1) range를 돌릴 때 i와 i-1의 사용을 잘 생각해야 한다.
answers와 같은 리스트의 인덱스는 0부터 시작하므로 i-1을 사용해야 한다
(혹은 range 범위와 앞뒤 -1 처리한 부분들도 함께 수정해도 된다)
(2) len(sp1)은 하드코딩 해도 되지만, 수포자의 패턴 자체를 수정하게 되면 그 길이값도 수정해야 하는 번거로움이 있기 때문에 len() 함수째로 작성했다.

def solution(answers):
    answer = []
    sp1 = [1, 2, 3, 4, 5]
    sp2 = [2, 1, 2, 3, 2, 4, 2, 5]
    sp3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    
    sp_dict = {
        1: 0
        , 2: 0
        , 3: 0
    }
    for i in range(1, len(answers)+1):
        if answers[i-1] == sp1[(i%len(sp1)) -1]:
            sp_dict[1] += 1
        if answers[i-1] == sp2[(i%len(sp2)) -1]:
            sp_dict[2] += 1
        if answers[i-1] == sp3[(i%len(sp3)) -1]:
            sp_dict[3] += 1    
    
    for k, v in sp_dict.items():
        if v == max(sp_dict.values()):
            answer.append(k)
    answer.sort()
    
    return answer
profile
어제보다 오늘 더

0개의 댓글