바위타는 두루미
(2018년)KAKAO BLIND RECRUITMENT_실패율 본문
문제
슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다.
이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라.
- 실패율은 다음과 같이 정의한다.
- 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.
제한사항
- 스테이지의 개수 N은 1 이상 500 이하의 자연수이다.
- stages의 길이는 1 이상 200,000 이하이다.
- stages에는 1 이상 N + 1 이하의 자연수가 담겨있다.
- 각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다.
- 단, N + 1 은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다.
- 만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.
- 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.
입출력 예
N | stages | result |
5 | [2, 1, 2, 6, 2, 4, 3, 3] | [3,4,2,1,5] |
4 | [4,4,4,4,4] |
My_Code
def solution(N, stages):
cur_level = [0]*(N+2)
for level in stages:
cur_level[level] +=1
total_users = [0]*(N+2)
total_users = cur_level[N+1]
fail_rates = []
for i in range(N,0,-1):
total_level = cur_level[i] + total_users
fail_rate = cur_level[i]/total_users if total_users != 0 else 0
fail_rates.append((fail_rate,i))
fail_rates.sort(key=lambda k:(k[0],-k[1]) ,reverse=True)
answer = [ s for rate, s in fail_rates]
return answer
접근법
우선 해당 스테이지에 멈춰있는 인원들 정보를 가진 리스트를 구성한다.
stages 한번 순회하면서 index = 스테이지번호로 생각하고 멈춰있는 인원들 정보를 저장.
그다음, 해당 스테이지까지 도달한 인원의 정보가 필요하기 때문에 가장 높은 스테이지에서 부터 순회하면서 인원을 더해가고
그 정보를 이용하여 fail_rate를 구해 (fail_rates)리스트에 추가함.
모든 스테이지의 실패율을 각각 가지고 있는 fail_rates리스트를 내림차순으로 정렬하고, 이때 같은 실패율일 경우는 오름차순으로 표현해야하기 때문에 스테이지 번호를 가지고 있는 2번째 데이터는 음수로 처리하여 연산한다.
그리고 정렬된 정보중 스테이지 번호만을 뽑아 결과 값으로 가진다.
Time Complexity
User의 갯수 = U, stage갯수 = N 이라고 했을때
O(U+N+Nlog(N))
'Study > Algorithm' 카테고리의 다른 글
[프로그래머스]도둑질 (3) | 2019.08.01 |
---|---|
[프로그래머스]단어변환 (0) | 2019.08.01 |
[LeetCode] 91. Decode way (0) | 2019.07.29 |
[LeetCode]3Sum Closest (0) | 2019.07.24 |
(2018년)KAKAO BLIND RECRUITMENT _ 오픈채팅방 (0) | 2019.07.23 |