https://programmers.co.kr/learn/courses/30/lessons/42889
코딩테스트 연습 - 실패율
실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스
programmers.co.kr
처음 문제를 읽고 이해하는데 한참 걸렸다...
입출력 예시 설명을 보고 겨우 이해를 했고, 결론은 실패율을 구하는 것이 아니라 실패율이 가장 높은 스테이지부터 순서대로 출력을 해야하는 문제였다.
정답 코드
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를 초기화 해야하는 위치만 빨리 떠올렸다면 이렇게 오래 걸리진 않았을텐데... 그게 잘 되지 않아서 어렵다고 느낀 것 같다!
GitHub - YOOHYOJEONG/algorithm_practice: 알고리즘 공부 및 코딩테스트 준비
알고리즘 공부 및 코딩테스트 준비. Contribute to YOOHYOJEONG/algorithm_practice development by creating an account on GitHub.
github.com