def solution(N, stages):
fail = {}
success = len(stages)
for i in range(1, N+1) :
if i not in stages :
fail[i] = 0
continue
else :
stop = stages.count(i)
fail[i] = stop/success
success -= stop
return sorted(fail, key=lambda x : fail[x], reverse=True)
풀이
1) stages에 없는 단계(실패율 0) 저장
fail = {}
success = len(stages)
for i in range(1, N+1) :
if i not in stages :
fail[i] = 0
continue
① i 단계가 실패율이 '얼마' 이다를 저장해주기 위해 딕셔너리를 만들어준다.
② 실패율이 " 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수 " 이므로
'스테이지에 도달한 플레이어 수'를 쉽게 계산하기 위해 stages의 길이를 success 변수에 저장해준다.
③ stages에는 1부터 N+1까지의 자연수가 담겨있기 때문에 for문의 범위도 range(1, N+1)로 설정해주었다.
④ 만약 i가 stages 리스트에 없다는 것은 i 스테이지에 멈춰있는 유저가 없거나, 스테이지에 도달한 유저가 없다는 의미이므로 fail에 { i : 0} 을 저장하고 반복문으로 다시 돌아간다.
2) 실패율 계산
else :
stop = stages.count(i)
fail[i] = stop/success
success -= stop
else문으로 온다는 것은 stages리스트에 있다는 의미이므로
① stop 변수에 i를 count하여 넣어준다.
② 실패율( stop/success )을 계산하여 fail에 저장한다.
③ 다음 실패율 계산을 위해 success(스테이지에 도달한 플레이어 수)에서 클리어하지 못한 플레이어 수를 빼준다.
3) 정렬
return sorted(fail, key=lambda x : fail[x], reverse=True)
sorted에 fail(실패율 딕셔너리)를 넘기면 fail의 key값들이 들어가게 된다. 여기에 lambda식을 이용하여 value를 기준으로 정렬해준다.
즉, value값으로 정렬하지만 반환되는건 key값들인 것이다 !
여기에 실패율이 높은 것 부터 정렬해야하므로 reverse=True 넣어준다.
'Algorithm > Programmers' 카테고리의 다른 글
[Python] 소수 만들기 (0) | 2021.05.11 |
---|---|
[Python] 오픈채팅방 (0) | 2021.05.07 |
[Python] 다트 게임 (0) | 2021.05.01 |
[Python] 비밀지도 (0) | 2021.04.30 |
[Python] 키패드 누르기 (0) | 2021.04.29 |