コーディングテスト練習-失敗率


コーディングテスト練習-失敗率
解関数を完了し、失敗率の高いステージからステージ番号を含む配列を降順に返します.

#エラーコード


37.0/100.0:ランタイムエラーとタイムアウト
O(n)O(n)+O(n)O(n)*O(n) => O(n^3)
def solution(N, stages): 
    fail_percent = dict()
    failed = 0
    people_len = len(stages)
    for i in range(1, N+1): 
        for j in range(people_len):
            if stages[j] <= i:
                failed += 1               
        fail_percent[i] = failed/people_len
        people_len -= failed
        for k in range(failed):
            if i in stages:
                stages.remove(i)
        failed = 0

    new_dic = sorted(fail_percent.items(), key=lambda x:x[1], reverse=True)
    return list(dict(new_dic).keys())
70.4/100:運転時エラー
O(n)*O(n) => O(n^2)
count時間複雑度:O(n)->完全ナビゲーション
def solution(N, stages): 
    fail_percent = dict()
    users = len(stages)
    for i in range(1, N+1):
        count = stages.count(i)
        fail_percent[i] = count / users
        users -= count
    
    new_dic = sorted(fail_percent.items(), key=lambda x:x[1], reverse=True)
    
    return list(dict(new_dic).keys())

#正解コード


解けないので質問ㅠㅠㅠㅠ=>チャレンジステージを例外処理する人数が0になる場合を参考に
#異常処理が正しくない場合、テストケースでランタイムエラーが発生します!!
def solution(N, stages):  
    fail_percent = dict()
    users = len(stages)
    for i in range(1, N+1):
        if users == 0: # 도전자가 0이 되는 경우
            fail_percent[i] = 0
            continue        
        count = stages.count(i)
        fail_percent[i] = count / users
        users -= count

                
    
    new_dic = sorted(fail_percent.items(), key=lambda x:x[1], reverse=True)
    
    return list(dict(new_dic).keys())