이 문제의 핵심이다. 저 말을 잘 풀어보기만 하면 문제에 대한 접근은 해결된다.
- 분자 : 말 그대로, stages 배열에서 해당 값을 가지고 있는 요소의 숫자를 얘기한다.
- 분모 : 각 요소의 값보다 크거나 같은 값을 지닌 요소의 숫자를 의미한다.
여기서 난 배열내 각 요소의 값마다 개수가 어떻게 되는지 파악해야한다고 봤고, 또한 반복문을 돌며 실패율을 계산하기 위해서는 (스테이지 번호 : 스테이지에 있는 플레이어 수) 를 원소로 가지는 배열이 스테이지 번호를 기준으로 정렬되어야 한다고 봤다. 처음에는 스테이지에 있는 플레이어 수를 value로 가지는 딕셔너리와 스테이지 별 실패율을 value로 가지는 딕셔너리를 따로 만들었는데, 최악의 케이스로 무려 1200ms 정도가 나와 문제 자체는 풀었지만 분명 개선해야한다고 생각했다.
문제는 반복문이 너무 많다는 점이었는데, 스테이지에 아무도 도달하지 않았으면 실패율을 0.0%로 계산한다는 조건을 고려하여 N만큼 반복하는 반복문에서 실패율만 계산해주며 해결했다. 조건을 정확히 인지하고, 어떤것을 기준으로 반복문을 돌릴지 잘 생각해서 문제를 해결하는 습관을 길러야한다.
딕셔너리 정렬
[python] 파이썬 딕셔너리 정렬 (tistory.com)
value 를 기준으로 정렬하는 방법은 두가지가 있는데, 하나는 operator 모듈을 import 하여 itemgetter() 메서드를 이용하는 것이고, 두번째는 sorted의 key 자리에 lambda 함수를 넣어서 튜플을 반환 받는 것이다.
코드
from collections import Counter
def solution(N, stages):
answer = {}
fail = 0 # 스테이지에 도달했지만 클리어 실패 + 도달 못한 유저 숫자
userNum = len(stages) # 전체 유저 숫자
ary = sorted(Counter(stages).items())
index = 0
for stageNum in range(1,N+1):
p = userNum-fail
try :
if stageNum == ary[index][0]:
answer[stageNum] = ary[index][1] / p
fail += ary[index][1]
index += 1
else :
answer[stageNum] = 0.0
except :
answer[stageNum] = 0.0
return list(map(lambda x: x[0],sorted(answer.items(), key=lambda x : (-x[1], x[0]))))
'PS > 프로그래머스' 카테고리의 다른 글
약수의 개수와 덧셈 (lv1) (0) | 2022.07.04 |
---|---|
3진법 뒤집기 (lv1) (0) | 2022.07.04 |
체육복 (lv1) (0) | 2022.07.03 |
모의고사 (lv1) (0) | 2022.07.03 |
k번째 수 (lv1) (0) | 2022.07.03 |