728x90
from collections import Counter, defaultdict
def solution(N, stages):
answer = []
_stages = dict(Counter({n+1:0 for n in range(N+1)}))
_stages.update(dict(Counter(stages))) # {stage: 개수}
failure = defaultdict(list) # {실패율: [stage1, stage2, ...]}
clear = _stages[N+1]
for i in range(N, 0, -1):
clear += _stages[i]
if clear == 0:
failure[0].append(i)
else:
failure[_stages[i]/clear].append(i)
for f in reversed(sorted(failure.keys())): # [실패율 리스트] 내림차순 정렬
for stage in sorted(failure[f]): # [실패율이 f인 스테이지들] 오름차순 정렬
answer.append(stage)
return answer
<내 풀이 분석>
1. _stages = {스테이지 번호: 나온 횟수}
2. failure = {실패율: [스테이지, 스테이지, ...] }
3. clear에는 N+1번째 스테이지(모든 스테이지 클리어)에 해당하는 사람을 넣고 N, N-1, ... 내려가면서 값을 점점 증가시켜준다. (3번째 스테이지를 클리어한 사람이라면 2번째 1번째도 클리어한 거니까 역순으로 쌓아줌)
4. N부터 1까지 역순으로 for문 수행한다. clear에 해당 스테이지의 개수를 추가시켜주고, clear가 0인 경우와 0이 아닌 경우로 나눔.(0으로 나눌 수 없기 때문에)
5. failure에서 실패율에 해당하는 인덱스에 스테이지를 추가시켜줌.
6. 실패율들을 뽑아(key값들) 내림차순으로 정렬한 리스트에서 값(f)을 하나씩 뽑음
7. 실패율 f에 해당하는 스테이지들의 리스트를 오름차순으로 정렬한 리스트에서 값(stage)을 하나씩 뽑아 answer에 append시켜줌.
728x90
'알고리즘 > programmers[1]' 카테고리의 다른 글
[프로그래머스] 약수의 합: python3 (0) | 2022.01.21 |
---|---|
[프로그래머스] 약수의 개수와 덧셈: python3 (0) | 2022.01.21 |
[프로그래머스] 체육복: python (0) | 2022.01.20 |
[프로그래머스] 모의고사: python3 (0) | 2022.01.20 |
[프로그래머스] 소수 만들기: python3 (0) | 2022.01.16 |