[프로그래머스 / lv.1] 실패율


날짜: 2021년 6월 21일
소요 시간: 39분 58초
카테고리: 수학문제
태그: 레벨1, 파이썬

코딩테스트 연습 - 실패율

입출력 예시

Nstagesresult
5[2,1,2,6,2,4,3,3][3,4,2,1,5]
4[4,4,4,4,4][4,1,2,3]

내가 적은 코드

def solution(N, stages):
    answer = []
    fail_rate = []
    for i in range(N):
        success = 0
        for j in stages:
            if j-1 >= i:
                success += 1
        if success != 0:
            fail_rate.append(float(stages.count(i+1))/float(success))
        else:
            fail_rate.append(0)

    temp = sorted(fail_rate, reverse = True)

    for k in range(len(fail_rate)):
        answer.append(fail_rate.index(temp[k])+1)
        fail_rate[fail_rate.index(temp[k])] = ""
    return answer

풀이 과정

전체 스테이지의 수 N만큼 반복하는 반복문을 만든다.
stages의 원소들에 1을 뺀 값(range(N)은 0부터 N까지 / stage는 1부터 N+1까지)을 반복하여 N보다 클 경우 success에 1씩 더하여 카운팅한다.
분모(success)가 0이 되면 안되기 때문에 조건을 추가하고, 실패율을 계산하여 리스트 fail_rate에 순서대로 담는다.

리스트 temp에 오름차순으로 정리 한 fail_rate의 값들을 담는다.

fail_rate의 길이만큼 반복하여 실패율이 높은 값부터 정렬되어 있는 temp의 인덱스 값을 가진 fail_rate 원소의 인덱스 값에 1을 더한 값(배열의 인덱스 값은 0부터 시작하고, 스테이지는 1부터 시작하기 때문)을 리스트 answer에 추가한다.

-> 그러니까 실패율이 높은 순으로 정리한 리스트 temp의 원소의 인덱스 값을 리스트 fail_rate에서 인덱싱하여 그 값을 answer에 추가하면 실패율이 높은 스테이지 순으로 추가된다.

(중복 방지를 위해 한번 꺼낸 temp의 인덱스에는 빈 값을 삽입한다.)
실패율이 높은 순으로 정리된 스테이지 값이 들어가 있는 리스트 answer을 출력한다.

베스트 코드

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)

반성

  • 파이썬의 딕셔너리를 통해 더 간결하게 풀 수 있다는 것을 인지하고 있었으나 딕셔너리의 이해도가 낮아 제대로 활용할 수 없을 것 같아 딕셔너리로 풀지 못하였다. 파이썬을 좀더 자유자재로 활용할 수 있도록 이해도를 높일 필요가 있다.
  • 리스트의 원소를 인덱싱한 값을 또 sorting된 다른 리스트에 인덱싱하여 그 인덱스 값을 다른 리스트에 저장하는 건 내가 풀었지만 포스팅을 위해 다시 생각해도 또 헷갈리고 그런다…




© 2021. by hminkim