📌 실패율
💡 나의 풀이
처음 문제를 풀면서 다음과 같은 방법을 떠올렸다.
- 반복문이 진행될 때마다 전체
len
의 값이count
만큼 줄어들어야 하므로stages
를sort
해주고pop
으로i
값을 빼주기: 실패 - 이중 반복문을 사용해서 첫 번째 순서를 제외한 나머지 순서는 다음과 같이 선언하기
arr.count(i) / len(arr) - 이전 count(i)
: 실패 - 이전
count
로 반복문이 끝나기 전에 전체len
을 빼주기: 성공
결과적으로 3번째 방법으로 풀어서 맞았는데, 1번과 2번 방법으로 1시간 넘게 고민하다가 기운이 다 빠져버렸다. 😅 😅
또, 반례를 생각하지 않아서 1, 6, 7, 9, 13, 23, 24, 25번
테스트케이스에서 오답 판정을 받았다.
혹시라도 저 테스트케이스에서 오답 판정을 받았다면 다음 테스트 케이스를 실행해보자!
N = 5, stages = [3, 1, 2, 2, 2]
힌트는 다음과 같다.(하단 드래그!)
마지막 stages에서 0명의 사용자가 지원했으므로 분모가 0이 된다. 따라서, 아직 마지막 stages가 끝나지도 않았는데 더 이상 나눌 값이 없다면...? 어떻게 처리를 해줘야 할까? 한번 생각해보자.
3번을 이용하여 풀었던 자세한 방법은 다음과 같다.
- 전체
stages
를 변수로 선언해준다.(한 반복문이 끝날 때마다 이전count
값을 빼줘야 하기 때문이다.) - 반복문에서 현재 i값을 key로,
스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
를 value로 선언해준다. - 전체
stages
에서스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수
를 빼주자.
여기까지 진행하게되면, 다음과 같은 출력을 볼 수 있다. ({1: 0.125, 2: 0.42857142857142855, 3: 0.5, 4: 1.0, 5: 0}
)
왜 결과 값을 리스트
로 선언하지않고 딕셔너리
로 선언했을까? 실패율이 높은 stage
부터 내림차순으로 정렬해야 하기 때문이다.
즉, 일반적인 수의 큰값과 작은 값을 기준으로 오름차순 / 내림차순을 하는 게 아니라, 실패율을 기준으로 정렬해야 하기 때문에 key:value
형태인 딕셔너리로 선언했다.
이제 마지막으로 value
값을 기준으로 정렬하는데 내가 작성한 코드는 다음과 같다.return list(dict(sorted(stages_dic.items(), key=lambda x: x[1], reverse=True)).keys())
stages_dic
의item
중value
값을 기준으로 정렬한다.sorted
는 자동으로list
로 반환해주기 때문에dict
으로 바꾸고 그중key
값을 반환한다.- return 값이
list
이므로list
를 붙여준다.
다른 사람의 코드는 다음과 같이 선언할 수 있다.return sorted(stages_dic, key = lambda x: stages_dic[x], reverse = True)
- 딕셔너리에서
sorted
를 사용하면key
를 기준으로 정렬하는데 람다 함수를 사용해서stages_dic[x]
즉,value
를 기준으로 정렬한다.- 우리가 딕셔너리
value
값에 접근하기 위해서dic['key']
를 사용하는 것과 같은 원리다.
- 우리가 딕셔너리
두 번째 코드가 더 간편해 보인다. 기억했다가 나중에 써먹어야겠다.
# 나의 코드
def solution(N, stages):
stages_dic = {}
stages_len = len(stages)
for i in range(1, N+1):
if stages_len == 0:
stages_dic[i] = 0
else:
stages_dic[i] = stages.count(i) / stages_len
stages_len -= stages.count(i)
return list(dict(sorted(stages_dic.items(), key=lambda x: x[1], reverse=True)).keys())
# 다른사람의 코드
def solution(N, stages):
stages_dic = {}
stages_len = len(stages)
for i in range(1, N+1):
if stages_len == 0:
stages_dic[i] = 0
else:
stages_dic[i] = stages.count(i) / stages_len
stages_len -= stages.count(i)
return sorted(stages_dic, key = lambda x: stages_dic[x], reverse = True)
'Algorithm > 프로그래머스(Programmers)' 카테고리의 다른 글
[ 파이썬(python) ] 프로그래머스 level1 - 키패드 누르기 (0) | 2021.06.21 |
---|---|
[ 파이썬(python) ] 프로그래머스 level1 - 소수만들기 (0) | 2021.04.12 |
[ 파이썬(python) ] 프로그래머스 level1 - 비밀지도 (0) | 2021.04.07 |
[ 자바스크립트(JS), 파이썬(python) ] 프로그래머스 level1 - x만큼 간격이 있는 n개의 숫자 (0) | 2021.04.05 |
[ 자바스크립트(JS), 파이썬(python) ] 프로그래머스 level1 - 최대공약수와 최소공배수 (0) | 2021.04.05 |
댓글