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


質問する


出典:プログラマーコードテスト練習、模擬試験
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]

    I/O例説明


    I/O例#1
  • 捕手1はすべての質問に答えた.
  • 捕獲者2はすべての問題を間違えた.
  • 捕獲者3はすべての問題を間違えた.
  • だから一番多くの質問に答えた人は水泡子です.
    I/O例#2
  • 誰もが2つの問題に答えた
  • コード#コード#

    function solution(answers) {
        const answer = [1,2,3];
        const scores = [];
        
        // a,b,c가 찍는 방식을 각각의 배열에 저장
        const a = [1,2,3,4,5];
        const b = [2,1,2,3,2,4,2,5];
        const c = [3,3,1,1,2,2,4,4,5,5];
        
        // 정답들과 비교하여 맞춘 갯수를 scores 배열에 각각 넣음
        scores.push(answers.filter((el, index)=>a[index%a.length]===el).length);
        scores.push(answers.filter((el, index)=>b[index%b.length]===el).length);
        scores.push(answers.filter((el, index)=>c[index%c.length]===el).length);
        
        // scores에 들어있는 점수 중 가장 높은 점수만 남겨 반환함.
        // 이미 answer 배열이 오름차순 정렬되어 있으므로 filter가 반환하는 배열도 오름차순 정렬 되어있음
        // 따라서 동점자가 발생해도 다시 정렬해줄 필요가 없음
        return answer.filter(el=>scores[el-1]===Math.max(...scores));
    }