Programmers Hash失敗率

2963 ワード

[2019 KAKAO BLIND RECRUITMENT]失敗率


問題の説明:


スーパーゲーム開発者のオレリーは大きな悩みに陥った.彼女が作ったブランド「呉天成」は大きな成功を収めたが、最近は新しいユーザーの数が激減している.なぜなら、新しいユーザーと既存のユーザーの間の舞台の違いが大きすぎるからです.
どうすればいいか悩んだ彼女は、ゲームの時間を動的に増やして難易度を調整することにした.やはりスーパー開発者であり、ほとんどのロジックは実現しやすいが、失敗率を探す部分で危機に陥っている.オレリーの失敗率を求めるコードを完了します.
失敗率は次のように定義されます.
ステージに到着しても空になっていないプレイヤー数/ステージに到着したプレイヤー数
現在停止しているステージ番号を含む配列フェーズをパラメータとして指定した場合は、失敗率の高いステージからステージ番号を含む配列を降順に返すように、ソルバを完了します.

せいげんじょうけん

  • ステージの個数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]

    例の説明


    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]

    Code

    def solution(N, stages):
        
        #도달한 최종 스테이지당 인원 수 나타내는 dict 
        arv_dic = {id: 0 for id in range(1,N+2)}
        #해당 스테이지를 통과한 모든 인원 수 dict
        stay_dic = {}
        
        #각각 스테이지를 돌면서 arv_dic에 최종 스테이지에 인원 수 저장
        for x in stages:
            arv_dic[x] += 1
    
        fail_dic = {}
        temp = len(stages)
        #스테이지 1부터 N까지 돌면서 해당 스테이지를 통과했는지 차례로 stay_dic 에 저장
        for i in range(1,N+1):
            stay_dic[i] = temp
            temp -= arv_dic[i]
            if stay_dic[i] == 0: #만약 해당 스테이지 통과자가 없다면 0으로 저장, (0으로 나눌 수는 없음)
                fail_dic[i] = 0
            else:
                fail_dic[i] = (arv_dic[i]/stay_dic[i]) #실패확률을 스테이지별로 fail_dic에 저장
        
        # 실패확률이 높은 순서대로 리스트 형태로 정답을 return. (만약 실패확률이 같다면, 낮은 스테이지 부터 저장해줌)
        return sorted(fail_dic, key = lambda x:(-fail_dic[x],fail_dic)) 

    コード解析

  • を1周し、arv dictで最終ステージに人数を保存します.
  • ステージ1からNに移行し、そのステージを通過するか否かのステージdicに順次保存する.
    2-1. 失敗確率をフェーズ別にfail dicに格納します.
    2-2. 該当するステージ通過者がいなければ0に保存されます.(0に分けられない)
  • ソート()関数を用いて,失敗確率の高い順にリスト形式で正解を返す.(失敗の確率が同じなら低いステージから保存)
  • Output & Screen Shot



    より良いコード

    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)
    *출처 프로그래머스 정답들 중

    説明:


    count()関数を使用して、リストに対応する数をいくつか求めます.私が書いたコードの考え方と似ていますが、コードの複雑さが減少し、簡潔性と効率が大幅に向上しました.後でリストにcount()関数を使用して記述します.