본문 바로가기
Problem Solving/프로그래머스

[프로그래머스 programmers] 실패율

by ggyongi 2021. 4. 26.
반응형

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

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

Solution 1 - Counter 모듈 사용 / 일일이 더해야 하는 번거로움 존재

import collections
def solution(N, stages):
    lst = []
    counter = collections.Counter(stages)
    def stage(i):
        challenge = 0
        fail = 0
        for key in range(i, N+2):
            if key >= i: 
                challenge += counter[key]
            if key == i:
                fail += counter[key]
        if not challenge:
            return 0
        return fail / challenge

    for i in range(1, N+1):
        lst.append([i,stage(i)])

    lst.sort(key = lambda x : (-x[1], x[1]))
    return [x[0] for x in lst]

Counter를 사용하여 풀었지만 비효율적인 요소가 존재한다.

challenge를 더하면서 구할때 리스트라면 슬라이싱으로 훨씬 간단하게 구현할 수 있기 때문이다.

그래서 리스트를 사용해서 다시 풀어봤다.

 

그리고 마지막에 정답 리스트를 구현할 때 위에서는 정렬을 한 후 다시 리스트 컴프리헨션으로 새 리스트를 만들어냈다. 하지만 딕셔너리를 사용한다면 value에 따른 정렬을 한 후 key를 출력하면 되기 때문에 훨씬 간편해진다. 

딕셔너리도 정렬이 된다는 점 잊지말자!!!

 

Solution 2 - 리스트 사용 / 슬라이싱으로 연속된 값 빠르게 합산

def solution(N, stages):
    lst = [0]*(N+2)
    for stage in stages:
        lst[stage] +=1
    
    dct = {}
    for i in range(1, N+1):
        challenge = sum(lst[i:])
        dct[i] = lst[i] / challenge if challenge else 0
    
    result = sorted(dct, key=lambda x: dct[x], reverse=True)
    return result
 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글