Programmers Brute Forceシミュレーション試験

2668 ワード

[完全探索]模擬試験


Link: https://programmers.co.kr/learn/courses/30/lessons/42840?language=python3

問題の説明


数学は数学を放棄する人の略語である.「囚人3人組」は模擬試験で数学の問題を全部撮りたいと思っている.最初の問題から最後の問題まで、執胞子は以下の通りである.
1番捕手の撮り方:1,2,3,4,5,1,2,3,4,5...
2番捕手の撮り方:2、1、2、3、2、4、2、5、2、2、3、2、4、2、5...
3番捕手の撮り方:3,3,1,1,2,2,4,5,5,3,3,1,2,2,4,5,5...
最初の問題から最後の問題までの正解が順番に並んでいる場合は、最も多くの質問に答えた人が誰なのか、答えを並べて返すように解答関数を書いてください.

せいげんじょうけん

  • 試験には最大10000問が含まれています.
  • 題の正解は1,2,3,4,5の1つです.
  • 点数が一番高い人が何人かいる場合は、返される値を昇順に並べてください.
  • I/O例


    answers return
    [1,2,3,4,5][1]
    [1,3,2,4,2][1,2,3]

    例の説明


    は#1
    捕手1はすべての質問に答えた.
    逮捕者2はすべての問題を間違えた.
    逮捕者3はすべての問題を間違えた.
    だから一番多くの質問に答えた人は水泡子です.
    はい#2
    誰もが2つの問題に正解した.

    Code

    def solution(answers):
    
        list_1 = [1, 2, 3, 4, 5]
        list_2 = [2, 1, 2, 3, 2, 4, 2, 5]
        list_3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
        count = {id: 0 for id in range(1,4)}
    
        for i in range(0,len(answers)):
            if answers[i] == list_1[i%5]: count[1] += 1
            if answers[i] == list_2[i%8]: count[2] += 1
            if answers[i] == list_3[i%10]: count[3] += 1
    
        count_list = sorted(count, key = lambda x: (-count[x],x))
    
        answer = []
        max_ = count[count_list[0]]
        for x in count_list:
            if count[x] == max_:
                answer.append(x)
    
        return answer

    コード解析と説明

  • の逮捕者1,2,3のリストを書きます.
  • countは、各受信者が正しい答えを格納する辞書タイプです.
  • 正解リスト「answers」の順に並び、散布者1,2,3が正解するとcountは1増加する.
  • countディックシーケンスを値でソートし、count listに「key」値をリスト形式で再格納します.
  • の前から順番に正解数を比較し、正解数が一番多い場合は、該当する数字を正解リストに入れます.
  • Output / Screen Shot



    Better Code/より良いコード

    def solution(answers):
        pattern1 = [1,2,3,4,5]
        pattern2 = [2,1,2,3,2,4,2,5]
        pattern3 = [3,3,1,1,2,2,4,4,5,5]
        score = [0, 0, 0]
        result = []
    
        for idx, answer in enumerate(answers):
            if answer == pattern1[idx%len(pattern1)]:
                score[0] += 1
            if answer == pattern2[idx%len(pattern2)]:
                score[1] += 1
            if answer == pattern3[idx%len(pattern3)]:
                score[2] += 1
    
        for idx, s in enumerate(score):
            if s == max(score):
                result.append(idx+1)
    
        return result
    
    * 출처 프로그래머스 정답들 중

    コードの説明


    ほとんどのコードは似ています.違いは、インデックス番号とそのインデックス番号のリスト値を同時に取得できる列挙という関数を使用するため、dictionaryを使用する必要はありません.