[javascript-algorithm]プログラマー-シミュレーション試験


(1)問題リンク


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

(2)解答と解説1


-問題を解く

        const answers = [1, 3, 2, 4, 2]

        function solution1(answers){
            const answer = []
            const mathGiver = [[1, 2, 3, 4, 5], [2, 1, 2, 3, 2, 4, 2, 5], [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]]
            const count = [0, 0, 0]

            for(let i = 0; i < answers.length; i++){
                if(mathGiver[0][i % mathGiver[0].length] == answers[i]) count[0]++;
                if(mathGiver[1][i % mathGiver[1].length] == answers[i]) count[1]++;
                if(mathGiver[2][i % mathGiver[2].length] == answers[i]) count[2]++;
            }

            for(let j = 0; j < count.length; j++){
                if(count[j] == Math.max(...count)) answer.push(j+1);
            }

            return answer;
        }

        console.log(solution1(answers));

-問題の説明

  • 各水泡の撮影モードをMathGiver変数の形で並べた.
  • for文を使用して、各受信者のモードが正しい場合、応答カウント変数に対応するインデックス要素を追加し、文を使用する場合、条件を追加します.正解を含む配列の要素を演算子を含むパターンMathGiver配列の要素と比較し、配列の配列の要素が近い場合はi値をMathGiver配列の要素長で除算します.答えの並びが長くなるのを防ぐためです.2つの配列を比較し,2つの配列の要素が同時にcountを増加させる.
  • 増減のconut配列を比較するためにfor文を用いる.このときif文挿入条件を再利用し,conut配列の各要素がconutの最大値に等しい場合,対応するindex+1を答えにプッシュすることを条件とする.このとき+1をするのは,問題の戻りが少なくとも1から始まるためである.(1番目の小胞子、2番目の小胞子、3番目の小胞子で最も答えの多い小胞子出力)は、最大値のMathを返します.max()関数のパラメータ...count(スプレッドシート演算子)が使用されています.countのようにスプレッドシート演算子ではなく、配列挿入時にNaNが出力されるためです.数値タイプではないためです.したがって、スプレッドシート演算子を使用して配列を展開できます.
  • プッシュの答えを出力します.
  • (2)問題解きと説明2


    - 문제풀이

            const answers = [1, 3, 2, 4, 2]
    
            function solution2(answers) {
                const answer = [];
                const mathGiver1 = [1, 2, 3, 4, 5];
                const mathGiver2 = [2, 1, 2, 3, 2, 4, 2, 5]
                const mathGiver3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
    
                const mathGiver1Count = answers.filter((a,i)=> a === mathGiver1[i%mathGiver1.length]).length;
                const mathGiver2Count = answers.filter((a,i)=> a === mathGiver2[i%mathGiver2.length]).length;
                const mathGiver3Count = answers.filter((a,i)=> a === mathGiver3[i%mathGiver3.length]).length;
                const max = Math.max(mathGiver1Count,mathGiver2Count,mathGiver3Count);
    
                if (mathGiver1Count === max) answer.push(1);
                if (mathGiver2Count === max) answer.push(2);
                if (mathGiver3Count === max) answer.push(3);
    
                return answer;
            }
    
            console.log(solution2(answers))

    -問題の説明

  • フィルタ()法を用いて,正解を含む配列回答の配列要素とmathGiver配列要素を比較した.2つの配列要素が同じ場合、新しい配列に戻り、正しい答えの個数を割り当てるために、新しい戻り配列の長さを返します.
  • 最大変数にMathを追加します.max()関数を用いて,指定した解答個数の変数をパラメータ比較により比較して最大解答個数を指定する.
  • 条件文を用いて,各水泡者が当てた答えの個数が最大個数に等しい場合,その水泡者を答えに押し込む.
  • プッシュの答えを出力します.
  • (3)参考資料

  • Array.prototype.filter()