https://programmers.co.kr/learn/courses/30/lessons/42889
처음 문제를 읽고 이해하는데 한참 걸렸다...
입출력 예시 설명을 보고 겨우 이해를 했고, 결론은 실패율을 구하는 것이 아니라 실패율이 가장 높은 스테이지부터 순서대로 출력을 해야하는 문제였다.
정답 코드
def solution(N, stages):
answer = []
all_num = len(stages)
num = {}
for i in range(1, N+1) :
cnt = 0
for step in stages :
if step == i:
cnt += 1
if cnt == 0 :
num[i] = 0
else :
num[i] = (cnt/all_num)
all_num = all_num - cnt
answer = sorted(num, key = lambda x : num[x], reverse = True)
return answer
꽤 오래 시간이 걸렸던 문제인데 cnt를 초기화해주는 위치를 처음에 잘못 잡아서 한참 버벅거린 것 같다.
all_num은 스테이지에 도달한 사람의 수이며 cnt는 해당 스테이지를 클리어 하지 못한 사람의 수이다.
스테이지 개수인 N만큼 반복이 돌기 전에 cnt를 초기화 해 주어야 했는데 이 초기화 위치를 처음에 2중 for문 밖으로 빼버리는 실수를 했다.
이후에는 num을 딕셔너리로 할 생각을 못하고 비어있는 리스트로 만들었었는데 그렇게 했더니 실패율에 해당하는 스테이지를 뽑아낼 수가 없었다.
때문에 num을 딕셔너리로 만들어 준 후 i로 인덱스를 지정하여 key와 key 값 모두 할당을 해주었다.
num에 값을 넣은 후에는 all_num인 스테이지에 도달한 사람의 수가 이전 스테이지에서 실패한 사람 즉, cnt만큼 줄어들어야 하기 때문에 all_num = all_num - cnt로 초기화를 해주었다.
이후에는 sorted 함수에 lambda 식을 사용하여 key를 기준으로 정렬을 해주었다.
딕셔너리를 쓰는 방법과 cnt를 초기화 해야하는 위치만 빨리 떠올렸다면 이렇게 오래 걸리진 않았을텐데... 그게 잘 되지 않아서 어렵다고 느낀 것 같다!