"스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수를 스테이지에 도달한 플레이어 수로 나눈 실패율"을 각 스테이지별로 계산하여, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 반환하는 함수 작성
def solution(N, stages):
curr_stage = [0 for _ in range(max(stages)+1)]
fail_rate = {i: 0 for i in range(1, N+1)}
for user in stages:
curr_stage[user] += 1
for i in range(1, N+1):
fail_rate[i] = curr_stage[i] / sum(curr_stage[i:])
return [i for i, _ in sorted(fail_rate.items(), key=lambda x: x[1], reverse=True)]
def solution(N, stages):
curr_stage = [0 for _ in range(max(stages)+1)]
fail_rate = {i: 0 for i in range(1, N+1)}
for user in stages:
curr_stage[user] += 1
for i in range(1, N+1):
if sum(curr_stage[i:]) > 0:
fail_rate[i] = curr_stage[i] / sum(curr_stage[i:])
else:
fail_rate[i] = 0
return [i for i, _ in sorted(fail_rate.items(), key=lambda x: x[1], reverse=True)]
cf) 문제에서 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다 라는 내용이 있었는데, 이를 신경 안쓰고 풀다보니 1/6/7/9/13/23/24/25 케이스에서 런타임 오류가 발생하였다.
예를 들어, 전체 스테이지가 5단계이면서 모든 인원이 3단계에서 실패할 경우 4/5단계의 실패율은 0이 되어야 하지만, 단순히 분모를 남은 유저수로 해놓은 경우 Divide by Zero Exception
이 발생하여 런타임에러가 된다.
curr_stage
를 최대 스테이지 크기만큼 생성하고, for
Loop으로 stages
를 순회하며 유저 데이터를 배열에 넣음.N
만큼 생성하여 초기값을 0으로 설정함.dict()
타입의 items()
함수로 반환된 튜플의 value를 기준으로 reverse=True
정렬하여 리스트화 진행