실패율 = 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return
stages에는 1 이상 N + 1 이하의 자연수가 담겨있음
각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타냄
N + 1 은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타냄
만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 정렬
스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의
"""
입출력 예시)
N = 5, stages = [2, 1, 2, 6, 2, 4, 3, 3] -> [3,4,2,1,5]
N = 4, stages = [4,4,4,4,4] -> [4,1,2,3]
"""
def solution(N, stages):
answer = {}
reached = len(stages) # 스테이지에 도달한 플레이어 수
for stage in range(1, N+1):
if reached != 0:
not_clear = stages.count(stage) # 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수
answer[stage] = not_clear/reached # 각 스테이지당 실패율
reached -= not_clear # 스테이지가 올라갈수록 남아있는 플레이어의 수는 줄어듦
# N번째 스테이지까지 모두 클리어한 플레이어의 경우
else:
answer[stage] = 0 # 해당 스테이지의 실패율은 0
# value(실패율)을 기준으로 내림차순 정렬하고 key(stage)만 출력
return sorted(answer, key=lambda x:answer[x], reverse=True)
-> 딕셔너리와 count() 이용
리스트 요소 개수 구하기
len()
리스트 전체의 요소 개수
len(list)
count()
리스트의 특정 요소 개수
list.count('x')
처음엔 스테이지에 도달한 플레이어 수와 클리어하지 못한 플레이어의 수를 각각 리스트에 담아서
리스트끼리 연산으로 실패율을 구한 다음 튜플로 받아 정렬했는데
이렇게 작성했더니 런타임 에러로 통과 못함
처음에 작성했던 코드
def solution(N, stages):
answer = []
reached = [] # 스테이지에 도달한 플레이어 수
not_clear = [] # 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수
for n in range(1, N+1):
# n번째 스테이지일 때, stages가 n과 같거나 큰 플레이어
r = [s for s in stages if s >= n]
reached.append(len(r)) # 스테이지별 스테이지에 도달한 플레이어 수
# n번째 스테이지일 때, stages가 n과 같은 플레이어
nc = [s for s in stages if s == n]
not_clear.append(len(nc)) # 스테이지별 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수
# 스테이지별 실패율
fail_rate = [x/y for x,y in zip(not_clear, reached)]
fr_tuple = []
for fr in enumerate(fail_rate):
fr_tuple.append(fr) # [(인덱스, 실패율)]
fr_tuple.sort(key=lambda x:x[1], reverse=True) # 실패율이 높은 스테이지부터 내림차순 정렬
answer = [x[0]+1 for x in fr_tuple] # 스테이지의 번호가 담겨있는 배열
return answer