본문 바로가기

PS/프로그래머스

[프로그래머스-Level 1] 실패율_파이썬

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

 

코딩테스트 연습 - 실패율

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

programmers.co.kr


from collections import Counter


def solution(N, stages):
    fail = [0] * (N+1)
    clients = len(stages)
    counter = Counter(stages)
    
    for i in range(1, N+1):
        count = counter[i]
        if clients:
            fail[i] = count / clients
        clients -= count
    
    result = []
    for idx, v in enumerate(fail[1:], start=1):
        result.append([idx, v])
    result = sorted(result, key=lambda x: (-x[1], x[0]))
    
    return [r[0] for r in result]

이 문제를 풀기 위해서는, 각 스테이지의 실패율을 구해야 한다.

 

우선, 필요한 변수를 설정하자.

각 스테이지의 실패율을 담는 배열 fail,

유저의 수 clients,

각 스테이지에 멈춰있는 유저의 수를 담는 counter

혹시 collections 모듈의 Counter 클래스 사용법을 모른다면, 검색해서 이해하는 것을 추천한다.

스테이지는 1 부터 N 까지의 수로 구성되어 있으므로, 해당 조건을 이용해 for문을 돌린다.

for문에서 주의해야할 점은 다음과 같다.

  • 0으로 나누는 에러를 방지하기 위해서 if clinets: 조건문 추가
  • 매번 유저의 수를 빼줘야 다음 스테이지의 실패율을 구할 수 있다.

이제 모든 스테이지의 실패율을 구했으니, 적절한 정렬 조건을 추가해 마무리 하면 된다.

  • fail 의 0번 인덱스는 쓰지 않는 값이기 때문에 fail[1:] 을 사용한다.
  • 각 스테이지는 1번 부터 시작하기 때문에 enumerate 의 시작을 1로 설정한다.
  • 실패율을 기준으로 내림차순 정렬한다. 단, 실패율이 같을 경우 작은 숫자가 앞으로 온다.
  • 정렬을 마친 result 는 [숫자, 실패율] 로 구성되어 있는데, 우리는 숫자만 필요하므로 리스트 컴프리헨션을 이용해 숫자만 추출한다.