[프로그래머스] 실패율 [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 로 한루프마다 갱신해면서 

한루프에 {스테이지번호,스테이지 실패율을} 구할 수 있는 코드이다.

생각보다 너무 짧은 길이의 코드여서 놀랐다~

 

반응형

+ Recent posts