Just Fighting

[프로그래머스] 실패율 본문

Algorithm/코딩테스트 연습

[프로그래머스] 실패율

yennle 2022. 1. 31. 17:22
728x90

 

https://programmers.co.kr/learn/courses/30/lessons/42889

 

코딩테스트 연습 - 실패율

실패율 슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스

programmers.co.kr

 

 

<문제 설명>

스테이지의 개수 N과 게임 이용자가 현재 머물러 있는 스테이지가 담긴 배열 stages가 매개변수로 주어진다.

이를 이용해 각 스테이지마다의 실패율을 구하고, 실패율이 높은 순서로 스테이지의 번호를 배열에 담아 리턴한다.

 

stages에 N+1은 스테이지 N을 통과했다는 의미.

실패율이 같다면 스테이지 번호가 낮은 순서가 먼저.

스테이지에 도달한 사람이 아무도 없으면 실패율은 0으로 정의.

 

 

 

 

<문제 이해>

먼저 stages에 있는 수를 collections.Counter()를 이용하여 세고,

그것을 이용하여 실패율을 구하면 될 것이라고 생각했다.

 

실패율은 현재 i 스테이지에 있는 사람의 수를 Xi라고 했을 때

처음에는 Xi / (len(stages)-X(i-1)) 이라고 생각했으나

분모에 X(i-1)이 아니라 X0부터 X(i-1)이 합한 값이 들어가야 맞다고 생각했다.

 

그리고 마지막으로 실패율 딕셔너리를 이용하여 value 값을 정렬해 리턴하면 된다고 생각했다.

 

 

 

 

<문제 풀이>

import collections

def solution(N, stages):
    prop = {}
    cnt = collections.Counter(stages)
    
    for i in range(N+2):				# stages에 없는 숫자 넣어주기
        if i not in cnt : cnt[i] = 0
    
    cal = 0						# 실패율 계산
    for i in range(1, N+1):
        cal += cnt[i-1]					# X0부터 X(i-1)까지의 합계
        if cnt[i] == 0: prop[i] = 0			# 사람이 아무도 없으면 실패율 0
        else: prop[i] = cnt[i]/(len(stages) - cal)	# 그렇지 않으면 실패율 계산
    
    return list(dict(sorted(prop.items(), key = lambda x : x[1], reverse=True)).keys())

문제 이해와 접근은 나쁘지 않았는데 collections.Counter 함수 이름을 자꾸 까먹는다...;;;

 

 

 

 

<풀이 개선>

다른 사람의 풀이를 보다가 딕셔너리 값 정렬하는데 조금 더 간단한 코드가 있어서 추가한다.

return sorted(prop, key = lambda x : prop[x], reverse=True)
728x90
Comments