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로 반복된다(순환 리스트 구현가능)
'알고리즘 > programmers[1]' 카테고리의 다른 글
[프로그래머스] 실패율: python3 (0) | 2022.01.20 |
---|---|
[프로그래머스] 체육복: python (0) | 2022.01.20 |
[프로그래머스] 소수 만들기: python3 (0) | 2022.01.16 |
[프로그래머스] [1차] 다트 게임 다른 풀이 (0) | 2022.01.16 |
[프로그래머스] [1차] 다트 게임: python3 (0) | 2022.01.16 |