[プログラマ(LV 1)]失敗率


問題の説明


  • 失敗率
    =ステージに到達しても空になっていないプレイヤー数/ステージに到達したプレイヤー数

  • 現在停止しているステージ番号を含む配列フェーズをパラメータとして指定した場合は、失敗率の高いステージからステージ番号を含む配列を降順に返すように、ソルバを完了します.
  • 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]
    #2
    모든 사용자가 마지막 스테이지에 있으므로 4번 스테이지의 실패율은 1이며 나머지 스테이지의 실패율은 0이다.
    
    [4,1,2,3]

    私が書いたコード

  • タイムアウトに失敗したコード
  • func solution(_ N: Int, _ stages: [Int]) -> [Int] {
    
        var pass: [Int] = []//스테이지에 도달한 사람의 수
        var fail: [Int] = [] //도달했지만 스테이지를 실패한 사람의 수
        var doubleRate: [Double] = [] //단계별 실패율을 요소로 갖는 배열
        var rate: [Int] = []
    
        for i in 0..< N {
            pass.append(stages.filter{$0 >= (i + 1)}.count)
            fail.append(stages.filter{$0 == (i + 1)}.count)
    
            if pass[i] != 0 {
                doubleRate.append(Double(fail[i]) / Double(pass[i])) //각 스테이지의 실패율
            } else {
                doubleRate.append(0.0)
            }
        }
        for i in 0..<N {
            //rate에 실패율이 높은 순서대로 (인덱스 + 1)을 넣어줘서 리턴해야함
            rate.append(doubleRate.firstIndex(of: doubleRate.sorted{$0 > $1}[i])! + 1)
            doubleRate[doubleRate.firstIndex(of: doubleRate.sorted{$0 > $1}[i])!] = 2
        }
        return rate
    }
    5、9、22日にタイムアウトが発生し、通過しなかった.ステージの長さは最大200000です.フィルタを介してstageで条件を満たすフィルタをフィルタするのにも多くの時間がかかります.
    私は通過した人数と失敗した人数を求めることで失敗率を求めようとした.しかし、考えてみれば、この舞台に着いた人は、失敗した人数を見つけることができる.
    つまり、第1段階に達した人が8人、第2段階に達した人が7人であれば、第1段階で失敗した人は8-7人である.
  • の他の分コードを参照して記述されたコード
  • func solution(_ N: Int, _ stages: [Int]) -> [Int] {
    
        var rate: [Int: Double] = [:]
        var fail = [Int](repeating: 0, count: N + 1)
    
        for i in stages {
            for j in 0..<i {
                fail[j] += 1
            }
        }
        for i in 0..<N {
            rate.updateValue(Double(fail[i] - fail[i+1]) / Double(fail[i]), forKey: i + 1)
        }
    
        return rate.sorted {$0.key < $1.key}.sorted{$0.value > $1.value}.map{$0.key}
    }
    最後のステップでN+1の値が得られるため(ステップ5でstagesの要素には6が含まれる)、failもN+1のセルを生成します.
    for文を使用して、「各ステージに到達した人がどれだけ失敗したか」の配列に追加します.stagesの要素が2の場合、その人が第1段階を通過し、第2段階に達したことを示すので、failの[0]と[1]に1を加え、第1段階と第2段階に達した人を追加した.
    次にfor文を再利用し,上記の式を用いて失敗率を求め,dictionaryによりi+1に達するキー値の人数をそれぞれ加える.元の0番目のインデックスは最初のステップを意味するので、i+1に置きます.
    同じ失敗率が発生した場合は、まず小さな数字をソートし、次にソートを使用してvalueをソートし、mapを使用してキー値からなる配列を返します.
    個人的にタイムアウト問題の解決に苦労したので、他の人のコードを参考にしました.今から始めます.効率的なコードを自分で書くように努力します.