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

[프로그래머스][Level 1][Python] 실패율

by 빛밤하늘 2021. 7. 16.
반응형

밑의 링크는 프로그래머스에서의 문제 링크입니다.

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

 

 

 

 

 

 

 

 

파이썬 코드와 결과입니다.

# 전체 스테이지의 개수 N,
# 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 리스트 stages가 매개변수로 주어집니다.
def solution(N, stages):
    # 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호들을 저장할 리스트 변수를 선언합니다.
    answer = [None] * N
    # (스테이지 번호, 실패율) 튜플 정보를 저장할 리스트 변수를 선언합니다.
    all_stage_and_fail = [None] * N

    # 스테이지 번호 1부터 N까지 반복합니다.
    for stage_num in range(1, N + 1):
        # 현재 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수를 저장하는 변수를 선언합니다.
        on_stage_not_clear = len([i for i in stages if i == stage_num])
        # 현재 스테이지에 도달한 플레이어 수를 저장하는 변수를 선언합니다.
        on_stage = len([i for i in stages if i >= stage_num])

        # 현재 스테이지에 도달한 유저가 없는 경우
        if on_stage == 0:
            # 현재 스테이지의 실패율은 0입니다.
            fail = 0
        # 현재 스테이지에 도달한 유저가 있는 경우
        else:
            # 실패율의 정의에 따라 계산하고 저장한 변수를 선언합니다.
            # 실패율의 정의 : 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
            fail = on_stage_not_clear / on_stage

        # 현재 스테이지의 번호와 실패율 짝을 저장하는 튜플 변수를 선언합니다.
        stage_and_fail = (stage_num, fail)
        # all_stage_and_fail에 현재 스테이지의 번호, 실패율 짝 튜플을 넣어줍니다.
        all_stage_and_fail[stage_num - 1] = stage_and_fail

    # all_stage_and_fail의 값들을 실패율을 기준으로 내림차순 정렬합니다.
    all_stage_and_fail.sort(key=lambda stage: -stage[1])

    # 각 스테이지마다 반복합니다.
    for stage_num in range(N):
        # all_stage_and_fail에 있는 스테이지 정보의 순서대로 스테이지 번호를 answer에 넣어줍니다.
        answer[stage_num] = all_stage_and_fail[stage_num][0]

    # 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 리스트 answer의 값을 반환합니다.
    return answer

결과

 

스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수를  

len(tuple(filter(lambda stage: stage == stage_num , stages)))로 계산하고,

스테이지에 도달한 플레이어 수를
len(tuple(filter(lambda stage: stage >= stage_num, stages)))로 계산했더니 

몇 개의 테스트 케이스에서 시간 초과가 떴습니다.

예전에 filter 함수의 속도가 느리다고 언뜻 봤던 것 같은데, 제대로 조사해보고 포스팅해봐야겠습니다.

 

 

 

※ 궁금한 부분, 이상한 점 및 오타는 댓글에 부탁드립니다.

※ 더 효율적이고 빠른 정답을 환영합니다.

반응형

댓글