본문 바로가기

알고리즘/카카오 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' 카테고리의 다른 글

거리두기 확인하기 (Level 2)  (0) 2022.06.30
뉴스 클러스터링 (Level 2)  (0) 2022.06.28
괄호 변환 (Level 2)  (0) 2022.06.25
메뉴 리뉴얼 (Level 2)  (0) 2022.06.25
크레인 인형뽑기 게임 (Level 1)  (0) 2022.06.24