본문 바로가기
알고리즘/프로그래머스

프로그래머스 Lv1 실패율(python)

by 개발하는 호랑이 2024. 2. 9.

실패율

 

풀이

문제에서 당연히 zero division이 없을 줄 알았는데, zero division의 경우도 고려해야해서 한 번 실패했다.
코드를 몇 번 수정하다가 도전한건데 쓰읍 아쉽다.

# 오렐리, #실패율은 다음과 같이 정의
# 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 /스테이지에 도달한 플레이어 수
# 총 스테이지 갯수 N
# 사용자가 현재 멈춰있는 스테이지 번호 stages
# 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 retun

# 각 스테이지에 도착했던 모든 수를 책정
# 각 스테이지에 머물러 있는 사람 수

def solution(N, stages):
    # 1~N+1까지의 인덱스를 이용하기 위함
    stage_contact_number = [0] * (N+2)
    stage_fail_number = [0] * (N+2)
    stage_orelli = {}
    
    for stage in stages:
        stage_contact_number[stage] += 1
        stage_fail_number[stage] += 1
    
    # stage_contact_number를 구하기 위해 다음 for문
    for i in range(1, N+2):
        if i != N+1:
            stage_contact_number[i] = sum(stage_contact_number[i:])
    
    # stage_orelli에 비율 기입
    for i in range(1, N+1):
        if stage_contact_number[i] != 0:
            stage_orelli[i] = stage_fail_number[i] / stage_contact_number[i]
        else:
            stage_orelli[i] = 0

    value = sorted(stage_orelli, key= lambda x:stage_orelli[x], reverse = True)
    return value

다른 사람 풀이

풀이방법은 내가 했던 방법보다 훨씬 간단하다.
denominator를 이용해서 도달한 사람 수를 앞에서부터 실패한 사람만큼 줄이는 방법으로 시도했다.
왜 이 생각을 안했지???? 흐음. 역시 똑똑한 사람들 많다.

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)