문제
문제 설명
실패율
슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프렌즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다.
이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라.
- 실패율은 다음과 같이 정의한다.
- 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.
입력 & 출력
입출력 예
Nstagesresult
5 | [2, 1, 2, 6, 2, 4, 3, 3] | [3,4,2,1,5] |
4 | [4,4,4,4,4] | [4,1,2,3] |
풀이 과정
1. 문제에 나와있는 제약조건에 맞게 식을 구성해봅니다. 여기서 집중해야 할 변수는 두 가지입니다. 하나는 분모가 될 유저 토털이고 두 번째는 실패율입니다.
2. 실패율의 계산은 해당 스테이지에 있는 유저의숫자 / 총 도달한 유저의 숫자로 계산이 됩니다.
3. 2번을 수행하기 위하여 user_total이라는 변수를 사용하지만 여기서 이전 스테이지에서 사용된 사람의 숫자는 for문이 돌 때마다 빼주면서 다음 스테이지에 대한 실패율을 구하게 됩니다.
4. 이렇게 실해율을 구할 때 분모 값으로 user_total이 0인 값이 들어가면 에러가 생기게 되므로 예외 처리를 해주고 else문으로 실패율을 얻어내도록 하며 i 값을 이용해서 스테이지별 실패율을 저장하도록 합니다.
5. 4번에서 중요한 포인트는 count 값을 실수형 형변환을 해줘야 하는 것입니다. 만약에 이 부분을 생략하게 된다면 정수형 계산이 되어서 잘못된 값을 얻게 될 수 있으며 이렇게 되었을 때 count에 무수히 큰 수를 곱하여서 억지로 답으로 만들 수는 있지만 잘못된 방법입니다.
6. 4,5번에 있는 내용대로 스테이지별 실패율이 저장되게 구성해놓고 x[1] 번째 곧 실패율을 이용해서 정렬한 후 이것 중에 [0] 번째 값만 다시 answer 값으로 넣어주면서 리턴하여 줍니다.
코드
def solution(N, stages):
answer = []
user_total = len(stages)
fail_rate = 0
for i in range(1, N + 1):
count = stages.count(i)
if user_total == 0:
fail_rate = 0
else:
fail_rate = float(count) / user_total
user_total -= count
answer.append((i, fail_rate))
print(answer)
answer = sorted(answer, key=lambda x: x[1], reverse=True)
answer = [i[0] for i in answer]
return answer
'Algorithm' 카테고리의 다른 글
[프로그래머스] 문자열 내 p와 y의 개수 (0) | 2022.08.17 |
---|---|
[프로그래머스] [1차] 다트 게임 (0) | 2022.08.17 |
[프로그래머스] 문자열 내 마음대로 정렬하기 (0) | 2022.08.16 |
[프로그래머스] 자릿수 더하기 (0) | 2022.08.15 |
[프로그래머스] 두 정수 사이의 합 (0) | 2022.08.15 |