실패율

개발새발log·2021년 10월 8일
0

Programmers

목록 보기
10/35


개인적으로 이 문제는 문제 정리부터 확실히 하고 넘어가야 했던 어려운 문제다,,! 전에 C++로 푼 85점의 전적이 있더라😇

접근 방식

  1. Counter로 stages의 개수 통계 내고
  2. stage 1~N 순회하면서 각 stage 실패율 계산하기
    실패율 = 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
    ⬇️ 문제에 주어진 위 공식을 바탕으로 계산하면 아래와 같다
    if n인 key 존재:
         실패율 = 해당 value/해당 key 이상의 value 합
    else:
         실패율 = 0
  3. (stage, 실패율) dictionary value 기준 내림차순 정렬

대충 이런 알고리즘으로 풀었는데 아직 파이썬 쪼랩에게 낯선 많은 파이썬 툴(Counter, dictionary 등)이 필요해서 검색 지옥이였다☠️ 내가 봐도 코드 복잡해서 주석 잔뜩 달아놨다.

최종 코드

from collections import Counter

def solution(N, stages):
    stageStat = dict() #stage와 실패율 쌍 저장 배열
    stageCount = Counter(stages) #현재 스테이지 빈도 통계
    for stage in range(1, N+1): #stage1~N
        failRate = 0
        if stage in stageCount.keys():
            #해당 stage 이상의 새로운 딕셔너리 배열 생성 (분모값 해당 key 이상의 value 합을 구하기 위함)
            thisStageCount = {k:v for k, v in stageCount.items() if k >= stage} 
            failRate = stageCount[stage]/sum(thisStageCount.values())
        stageStat[stage] = failRate

    sortedStat = sorted(stageStat.items(), key=(lambda x:x[1]), reverse=True) #실패율 기준 정렬
    
    return list(map(lambda x:x[0], sortedStat)) #첫번째 요소(stage)만 필요하므로 

🛠 유용한 툴

  • dictionary comprehension을 활용한 생성
    {Key:Value for 요소 in 입력Sequence [if 조건식]}
    입력 Sequence란 Iteration이 가능한 데이터 Sequence 혹은 컬렉션

  • dictionary 정렬
    sortedStat = sorted(stageStat.items(), key=(lambda x:x[1]), reverse=True)
    - key 속성을 활용해 두번째 원소 기준 정렬 지정하기
    - reverse 속성을 활용해 내림차순 정렬하기 (default 오름차순)

profile
⚠️ 주인장의 머릿속을 닮아 두서 없음 주의 ⚠️

0개의 댓글