개인적으로 이 문제는 문제 정리부터 확실히 하고 넘어가야 했던 어려운 문제다,,! 전에 C++로 푼 85점의 전적이 있더라😇
실패율 = 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
(stage, 실패율)
dictionary value 기준 내림차순 정렬대충 이런 알고리즘으로 풀었는데 아직 파이썬 쪼랩에게 낯선 많은 파이썬 툴(Counter, dictionary 등)이 필요해서 검색 지옥이였다☠️ 내가 봐도 코드 복잡해서 주석 잔뜩 달아놨다.
from collections import Counter
def solution(N, stages):
stageStat = dict() #stage와 실패율 쌍 저장 배열
stageCount = Counter(stages) #현재 스테이지 빈도 통계
for stage in range(1, N+1): #stage1~N
failRate = 0
if stage in stageCount.keys():
#해당 stage 이상의 새로운 딕셔너리 배열 생성 (분모값 해당 key 이상의 value 합을 구하기 위함)
thisStageCount = {k:v for k, v in stageCount.items() if k >= stage}
failRate = stageCount[stage]/sum(thisStageCount.values())
stageStat[stage] = failRate
sortedStat = sorted(stageStat.items(), key=(lambda x:x[1]), reverse=True) #실패율 기준 정렬
return list(map(lambda x:x[0], sortedStat)) #첫번째 요소(stage)만 필요하므로
dictionary comprehension을 활용한 생성
{Key:Value for 요소 in 입력Sequence [if 조건식]}
입력 Sequence란 Iteration이 가능한 데이터 Sequence 혹은 컬렉션
dictionary 정렬
sortedStat = sorted(stageStat.items(), key=(lambda x:x[1]), reverse=True)
- key 속성을 활용해 두번째 원소 기준 정렬 지정하기
- reverse 속성을 활용해 내림차순 정렬하기 (default 오름차순)