알고리즘/programmers[1]

[프로그래머스] 모의고사: python3

fladi 2022. 1. 20. 00:45
728x90
def solution(answers):
    answer = []
    
    supo = {1:[1,2,3,4,5], 2:[2,1,2,3,2,4,2,5], 3:[3,3,1,1,2,2,4,4,5,5]}
    idx = {1:0, 2:0, 3:0}
    correct = [-1,0,0,0]
    
    for a in answers:
        for i in [1,2,3]:
            if supo[i][idx[i]] == a:
                correct[i] += 1
            idx[i] = (idx[i]+1)%len(supo[i])
                
    max_correct = max(correct)
        
    for i, c in enumerate(correct):
        if max_correct == c:
            answer.append(i)
    
    return sorted(answer)

<내 풀이 분석>

1. supo딕셔너리: 수포자 번호 1,2,3(key)/ 해당 수포자의 찍기 패턴(value, list)

2. idx 딕셔너리: supo의 value를 가리킬 인덱스를 저장함. 다음 인덱스를 가리킬 때는 idx[1] = (idx[1] + 1) % len(supo[1]) 식을 이용(0123401234 이런식으로 인덱스가 순환할 수 있도록 함)

3. correct는 1,2,3번 수포자가 맞춘 정답 개수를 저장함.(0번 인덱스는 사용하지 않음. 나올 수 없는 최소값인 -1을 부여)

4. answers의 답을 1,2,3번 수포자의 답과 비교함. 만약 해당 수포자의 답과 일치한다면 correct의 해당 인덱스를 1 증가시킴. 그리고 수포자의 다음 답(인덱스)를 가리킴. (순환을 위해 나머지 연산자를 이용함.)

5. 모든 answers와 비교가 끝난 후에는 correct리스트에서 최대 값을 알아냄. 

6. 최대값에 해당하는 correct의 인덱스를 알아내어 answer리스트에 append(추가)함. 중복될 수 있으므로 이런식으로 만들어줌.

7. 오름차순 정렬을 위해 sorted 내장함수 이용!

 

 

<부가설명>: idx = (idx  + 1) % len(supo[1])

list1 = [0, 1, 2, 3, 4]

len(list1) = 5

 

(0 + 1) % 5 = 1

(1 + 1) % 5 = 2

(2 + 1) % 5 = 3

(3 + 1) % 5 = 4

(4 + 1) % 5  = 0

(0 + 1) % 5 = 1

(1 + 1) % 5 = 2

(2 + 1) % 5 = 3

(3 + 1) % 5 = 4

 

=> % 연산을 이용하면 값이 0123401234로 반복된다(순환 리스트 구현가능)

 

 

 

 

728x90