본문 바로가기

알고리즘/카카오 EASY

실패율 (Level 1)

문제

 

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

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

 

내 풀이

 

Counter 함수를 써서 각 스테이지에 몇 명이 머물러 있는지 구하였다.

(현재 스테이지에 도달한 플레이어 수 = 전 단계 스테이지에 도달한 플레이어 수 - 전 단계에 실패한 플레이어의 수) 공식을 사용하였다.

스테이지에 도달한 유저가 없는 경우를 위해 예외 처리를 하였다.

 

from collections import Counter

def solution(N, stages):
    rates = []
    cnt = Counter(stages)
    cur = 0
    for i in range(1, N+1):
        if i == 1:
            cur = len(stages)
            rates.append((cnt[i]/len(stages), i))
        else:
            cur -= cnt[i-1]
            if cur > 0:
                rates.append((cnt[i]/cur, i))
            else:
                rates.append((0, i))
    return [x[1] for x in sorted(rates, key=lambda x: -x[0])]

 

다른 풀이

 

전체적인 알고리즘은 내 풀이와 동일하지만, 코드가 더 짧다.

 

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)

 

다른 풀이 참고하여 내 풀이 변형하기

 

from collections import Counter
def solution(N, stages):
    rates = []
    cnt = Counter(stages)
    cur = len(stages)
    for i in range(1, N+1):
        if cur != 0:
            rates.append((cnt[i]/cur, i))
            cur -= cnt[i]
        else: rates.append((0, i))
    return [x[1] for x in sorted(rates, key=lambda x: -x[0])]

 

총평

Level1인데도 불구하고 시간이 오래 걸렸다. 

문제를 풀 때 "어떻게 하면 효율적으로 문제를 풀 수 있을까"를 고민하고 풀어야겠다.

 

'알고리즘 > 카카오 EASY' 카테고리의 다른 글