[프로그래머스 Lv1] 실패율 (파이썬)

Jewon Joel Park·2022년 6월 8일
0

Programmers-solution

목록 보기
14/34

문제 링크


문제 설명

"스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수를 스테이지에 도달한 플레이어 수로 나눈 실패율"을 각 스테이지별로 계산하여, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 반환하는 함수 작성


풀이 코드

  • 최초 작성
def solution(N, stages):
    curr_stage = [0 for _ in range(max(stages)+1)]
    fail_rate = {i: 0 for i in range(1, N+1)}
    for user in stages:
        curr_stage[user] += 1
    for i in range(1, N+1):
        fail_rate[i] = curr_stage[i] / sum(curr_stage[i:])
        
    return [i for i, _ in sorted(fail_rate.items(), key=lambda x: x[1], reverse=True)]
  • 런타임 에러 수정 코드
def solution(N, stages):
    curr_stage = [0 for _ in range(max(stages)+1)]
    fail_rate = {i: 0 for i in range(1, N+1)}
    for user in stages:
        curr_stage[user] += 1
    for i in range(1, N+1):
        if sum(curr_stage[i:]) > 0:
            fail_rate[i] = curr_stage[i] / sum(curr_stage[i:])
        else:
            fail_rate[i] = 0
    return [i for i, _ in sorted(fail_rate.items(), key=lambda x: x[1], reverse=True)]

코드 설명

cf) 문제에서 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다 라는 내용이 있었는데, 이를 신경 안쓰고 풀다보니 1/6/7/9/13/23/24/25 케이스에서 런타임 오류가 발생하였다.
예를 들어, 전체 스테이지가 5단계이면서 모든 인원이 3단계에서 실패할 경우 4/5단계의 실패율은 0이 되어야 하지만, 단순히 분모를 남은 유저수로 해놓은 경우 Divide by Zero Exception이 발생하여 런타임에러가 된다.

  1. 최초 아이디어는 현재 스테이지를 담을 배열과 각 스테이지별 실패율을 담을 dict을 생성하여 각 스테이지별 실패율을 저장하고 이를 실패율로 내림차순 정렬하여 반환하는 것.
  2. 따라서 스테이지를 인덱스로 하는 배열 curr_stage를 최대 스테이지 크기만큼 생성하고, for Loop으로 stages를 순회하며 유저 데이터를 배열에 넣음.
  3. 만약 5스테이지를 통과한 사람이 존재하면 N+1이라는 값을 가지므로, 실패율은 1부터 주어진 스테이지의 수 N만큼 생성하여 초기값을 0으로 설정함.
  4. 이후 1부터 N까지 순회하며 각 스테이지별 실패율을 "현재 스테이지 번호에 있는 사람의 수"를 "이후 스테이지까지 모두 통과한 사람의 수의 합"으로 나눈 값으로 설정
  5. 반환해야하는 값은 실패율이 높은 스테이지의 순서이므로, dict()타입의 items()함수로 반환된 튜플의 value를 기준으로 reverse=True 정렬하여 리스트화 진행
  6. 위 참조에 작성한 내용을 바탕으로 0으로 나눗셈을 진행하지 않도록 if~else구문 작성
profile
10년을 돌고 돌아 마침내 제자리를 찾은 문과 출신 Python 개발자의 인생기록장

0개의 댓글