[テストエンコーディング]失敗率


プログラマコードテストの準備
https://programmers.co.kr/learn/courses/30/lessons/42889
質問の説明は次のサイトで確認できます.

<私が作成したコード>

def solution(N, stages):
  answer = []
  fail = []

  len_stg = len(stages)
  st_max = max(stages)

  for i in range(1,st_max):
    failcount = 0
    for j in range(len(stages)):
      if stages[j] == i :
        failcount +=1

    fail_rate = failcount / len_stg
    len_stg -= failcount
    answer.append((i,fail_rate))

  print(answer)
  answer = sorted(answer, key=lambda v: v[1], reverse=True)
  answer = [i[0] for i in answer]

  return answer

<他人が作成したコード>

from collections import Counter

def solution(N, stages):
    failure_p = []                       # 실패율을 저장할 배열 (저장되는 형태: [(스테이지 번호, 실패율), (스테이지 번호, 실패율),...]
    counter = Counter(stages)            # stages에 대한 Counter
    keys = sorted(list(counter.keys()))  # counter의 key들의 정렬된 배열
    items = sorted(counter.items())      # counter의 item들의 정렬된 배열

    for n in range(N):                   # N의 범위(스테이지의 번호 범위)에서
        if n+1 not in keys:              # keys에 n+1(스테이지 번호)가 없다면 -> 도전자가 없는 스테이지라면
            failure_p.append((n+1, 0))   # 이 스테이지 실패율은 0
        else:                            # 도전자가 있다면, 실패율은 현재 스테이지 도전자들 / 현재를 포함한 이후 모든 스테이지의 도전자들(이 스테이지를 통과한 사람들)
            failure_p.append((n+1, items[keys.index(n+1)][1] / sum(p for s, p in items[keys.index(n+1):])))

    failure_p.sort(key=lambda x:x[1], reverse=True) # 실패율 역순 정렬
    return [s for s,p in failure_p]      # 실패율 배열에서 스테이지 번호만 뽑아서 반환

🧑🏻 ポスト


ラムダ式と列挙、ディクシャナリーキー、値ソート、カウンタ概念を学ぶことができます.ディクシャナリーでは、キーワードでソートしますが、値でソートするにはランダ式を使うことに気づきました.