[프로그래머스] 실패율 [2019 KAKAO BLIND RECRUITMENT] [python] Level1
문제 설명
실패율
슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다.
이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라.
- 실패율은 다음과 같이 정의한다.
- 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.
입출력 예 설명
입출력 예 #1
1번 스테이지에는 총 8명의 사용자가 도전했으며, 이 중 1명의 사용자가 아직 클리어하지 못했다. 따라서 1번 스테이지의 실패율은 다음과 같다.
- 1 번 스테이지 실패율 : 1/8
2번 스테이지에는 총 7명의 사용자가 도전했으며, 이 중 3명의 사용자가 아직 클리어하지 못했다. 따라서 2번 스테이지의 실패율은 다음과 같다.
- 2 번 스테이지 실패율 : 3/7
마찬가지로 나머지 스테이지의 실패율은 다음과 같다.
- 3 번 스테이지 실패율 : 2/4
- 4번 스테이지 실패율 : 1/2
- 5번 스테이지 실패율 : 0/1
각 스테이지의 번호를 실패율의 내림차순으로 정렬하면 다음과 같다.
- [3,4,2,1,5]
입출력 예 #2
모든 사용자가 마지막 스테이지에 있으므로 4번 스테이지의 실패율은 1이며 나머지 스테이지의 실패율은 0이다.
- [4,1,2,3]
설계 및 구현
my_solution
def solution(N, stages):
complete = [0] * int(N)
Proceeding = [0] * int(N)
d = {}
# 1
for i in stages :
if i < N + 1:
Proceeding[i - 1] += 1
for j in range(i):
complete[j] += 1
else :
for j in range(i - 1):
complete[j] += 1
# 2
for i in range(len(complete)):
if Proceeding[i] == 0:
d[i + 1] = 0
else:
d[i+1] = Proceeding[i] /complete[i]
res = sorted(d.items(), reverse=True, key=lambda item: item[1])
answer = []
for i in range(len(res)):
answer.append(res[i][0])
return answer
접근방식
먼저 스테이지마다 완료한 사람의 수와 현재 진행중인 사람의 수를 파악하여 complete와 Proceeding에 저장을 한 후
이를 통해 스테이지마다 실패율 = 진행 중인 사람의 수 / (완료한 사람의 수 + 진행 중인 사람의 수) 을 구한다.
그리고 딕셔너리 자료형 인 d에 {스테이지,스테이지의 실패율}을 저장 d를 실패율을 기준으로 내림차순 정렬을 시킨후
d.keys()를 리스트형으로 변환해 반환하여 해결 할 수 있는 문제이다.
1. 완료한 유저의 수, 진행 중인 유저의 수 를 complete, Proceeding에 저장한다.
2. d (dict자료형) 에 스테이지번호와 실패율을 저장한다.
3. d를 실패율을 기준으로 내림차순 정렬 해준다.
4. 정렬된 d 에서 스테이지 번호만 리스트 형태로 반환해주면 해결~
모범 solution
def solution(N, stages):
result = {}
denominator = len(stages)
for stage in range(1, N+1):
if denominator != 0:
count = stages.count(stage)
result[stage] = count / denominator
denominator -= count
else:
result[stage] = 0
return sorted(result, key=lambda x : result[x], reverse=True)
위 풀이는 하나의 for문으로 스테이지번호와 실패율을 dict()형으로 구하였다.
count()함수를 이용해 간단히 진행 중인 사람의 수를 구하고
denominator -=count 로 한루프마다 갱신해면서
한루프에 {스테이지번호,스테이지 실패율을} 구할 수 있는 코드이다.
생각보다 너무 짧은 길이의 코드여서 놀랐다~
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 삼각 달팽이 [월간 코드 챌린지 시즌1] [python] (0) | 2020.09.22 |
---|---|
[프로그래머스] [1차]다트게임 [2018 KAKAO BLIND RECRUITMENT] [python] (0) | 2020.09.21 |
[프로그래머스] [1차]비밀지도 [2018 KAKAO BLIND RECRUITMENT] [python] (0) | 2020.09.21 |
[프로그래머스] 예산 [Summer/Winter Coding(~2018)] [python] (0) | 2020.09.21 |
[프로그래머스] 직사각형 별찍기 [연습문제] [python] (0) | 2020.09.21 |