失敗率


問題の説明
失敗率
スーパーゲーム開発者のオレリーは大きな悩みに陥った.彼女が作ったブランド「呉天成」は大きな成功を収めたが、最近は新しいユーザーの数が激減している.なぜなら、新しいユーザーと既存のユーザーの間の舞台の違いが大きすぎるからです.
どうすればいいか悩んだ彼女は、ゲームの時間を動的に増やして難易度を調整することにした.やはりスーパー開発者であり、ほとんどのロジックは実現しやすいが、失敗率を探す部分で危機に陥っている.オレリーの失敗率を求めるコードを完了します.
失敗率は次のように定義されます.
ステージに到着しても空になっていないプレイヤー数/ステージに到着したプレイヤー数
現在停止しているステージ番号を含む配列フェーズをパラメータとして指定した場合は、失敗率の高いステージからステージ番号を含む配列を降順に返すように、ソルバを完了します.
せいげんじょうけん
舞台の個数Nは1以上500以下の自然数である.
ステージの長さは1以上200000以下です.
ステージは、1以上N+1以下の自然数を含む.
各自然数は、ユーザが現在挑戦しているステージの番号を表します.
ただし、N+1は、最後のステージ(N番目のステージ)にクリアしたユーザを表す.
同じ失敗率の舞台があれば、トランペットの舞台を先に来てもらうことができます.
ステージに到着したプレイヤーがいない場合、そのステージの失敗率は0と定義されます.
I/O例
N stages result
5 [2, 1, 2, 6, 2, 4, 3, 3][3,4,2,1,5]
4 [4,4,4,4,4][4,1,2,3]
I/O例説明
I/O例#1
1番ステージには8人のユーザーが挑戦し、そのうち1人のユーザーはまだ通関していない.そのため、1番ステージの失敗率は以下の通り.
1ステージ失敗率:1/8
第2ステージには7人のユーザーが挑戦し、そのうち3人のユーザーはまだ通関していない.そのため、2番目の舞台の失敗率は以下の通りです.
フェーズ2失敗率:3/7
同様に、残りの舞台の失敗率は以下の通りである.
フェーズ3失敗率:2/4
フェーズ4失敗率:1/2
フェーズ5失敗率:0/1
各ステージの番号を失敗率の降順に並べます.
[3,4,2,1,5]
I/O例#2
すべてのユーザが最後のステージにいるため、4番目のステージの失敗率は1であり、残りのステージの失敗率は0である.
[4,1,2,3]
count = 0
total = 0
for i in range(1, n+1):
  for j in range(len(stages)):
    if i == stages[j]:
      count += 1
    
    if stages[j] >= i :
      total += 1
  
  result.append((i, count/total))
  
  count = 0
  total = 0
 나는 스테이지 숫자마다 머물러 있는 사람과 도전했던 사람을 하나하나 세고 추가하는 방식으로 했다
for i in range(1, N + 1):
        # 해당 스테이지에 머물러 있는 사람의 수 계산
        count = stages.count(i)

        # 실패율 계산
        if length == 0:
            fail = 0
        else:
            fail = count / length

        # 리스트에 (스테이지 번호, 실패율) 원소 삽입
        answer.append((i, fail))
        length -= count

하지만 책에서는 모든 사람의 수에서 스테이지를 못깬 사람은 수를 줄여가는 방식으로 더 최적화가 되어있다
좀 더 최적화 방향으로 연습해야겠다