[プログラマー]模擬試験


https://programmers.co.kr/learn/courses/30/lessons/42840

問題の説明


数学は数学を放棄する人の略語である.「囚人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例


    answersreturn[1,2,3,4,5][1][1,3,2,4,2][1,2,3]

    に答える

    def solution(answers):
        answer = []
        problem_count = len(answers) # 문항 수
        
        # 정답 패턴 생성
        one = [answer % 5 + 1 for answer in range(problem_count)]
        
        two = [2, 1, 2, 3, 2, 4, 2, 5] * problem_count
        two = two[:problem_count]
        
        three = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5] * problem_count
        three = three[:problem_count]
        
        # 정답 확인
        answer_array = [0, 0, 0]
        for i in range(problem_count):
            if answers[i] == one[i]: answer_array[0] += 1
            if answers[i] == two[i]: answer_array[1] += 1
            if answers[i] == three[i]: answer_array[2] += 1
                
        max_count = max(answer_array)
        for i, value in enumerate(answer_array):
            if value == max_count:
                answer.append(i+1)
                
        return answer
    質問数を使用して正解を生成し、正解と比較して各人の正解数を計算します.
    正解数が格納されているlistの最値が見つかり、対応する値が保存されている人が戻ってきます.

    整理する


    他の解答を見て、完全な解答リスト(メモリの無駄)を生成する必要はなく、このモードを繰り返し使用する方法で行います.
    後で印刷の仕方を比較するのは私と同じです.(enumerate()関数を使用)
    パターンに対してitertools.cycle関数を用いた人もいる.
    itertools.cycle:重複文字を自動的に生成するモジュール
    普段あまり使われていない関数を見るたびに驚きます.