코딩테스트 35일차

모의고사

수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 1번 문제부터 마지막 문제까지 다음과 같이 찍습니다.

1번 수포자가 찍는 방식: 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, ...
2번 수포자가 찍는 방식: 2, 1, 2, 3, 2, 4, 2, 5, 2, 1, 2, 3, 2, 4, 2, 5, ...
3번 수포자가 찍는 방식: 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, 3, 3, 1, 1, 2, 2, 4, 4, 5, 5, ...

1번 문제부터 마지막 문제까지의 정답이 순서대로 들은 배열 answers가 주어졌을 때, 가장 많은 문제를 맞힌 사람이 누구인지 배열에 담아 return 하도록 solution 함수를 작성해주세요.

function solution(answers) {
    var answer = [];

    var patterns = [
        [1, 2, 3, 4, 5],
        [2, 1, 2, 3, 2, 4, 2, 5],
        [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
    ];

    var scores = [0, 0, 0];

    for (var i = 0; i < answers.length; i++) {
        for (var j = 0; j < patterns.length; j++) {
            if (answers[i] === patterns[j][i % patterns[j].length]) {
                scores[j]++;
            }
        }
    }

    var maxScore = Math.max(...scores);

    for (var k = 0; k < scores.length; k++) {
        if (scores[k] === maxScore) {
            answer.push(k + 1);
        }
    }

    return answer;
}

✏️풀이

변수 answer를 빈 배열로 초기화합니다. 이 배열에 가장 많은 문제를 맞힌 수포자의 번호를 저장할 것입니다.

패턴을 저장하는 2차원 배열 patterns를 정의합니다. 각 수포자의 찍기 패턴이 배열로 저장되어 있습니다.

점수를 저장하는 배열 scores를 [0, 0, 0]으로 초기화합니다. 이 배열은 각 수포자가 맞힌 문제 수를 저장할 것입니다. 각 수포자의 점수를 인덱스로 매칭시킵니다.

반복문을 사용하여 answers 배열을 순회합니다. 이 반복문은 정답 배열을 기준으로 각 수포자의 패턴과 비교하여 맞힌 문제 수를 증가시킵니다.

바깥쪽 반복문에서는 i 변수를 0부터 answers.length - 1까지 증가시킵니다.
안쪽 반복문에서는 j 변수를 0부터 patterns.length - 1까지 증가시킵니다. 이는 각 수포자의 패턴을 확인하기 위한 반복문입니다.
answers[i]와 patterns[j][i % patterns[j].length]를 비교하여 같으면 수포자가 문제를 맞혔다는 의미이므로, 해당 수포자의 점수 scores[j]를 증가시킵니다.
scores 배열에서 가장 큰 값을 찾기 위해 Math.max(...scores)를 사용하여 최댓값을 구합니다.

scores 배열을 순회하면서 가장 큰 값과 동일한 값을 가지는 인덱스를 찾습니다. 이 때, 해당 인덱스에 1을 더하여 수포자의 번호로 변환하여 answer 배열에 추가합니다.

answer 배열을 반환합니다.

 

하샤드 수

양의 정수 x가 하샤드 수이려면 x의 자릿수의 합으로 x가 나누어져야 합니다. 예를 들어 18의 자릿수 합은 1+8=9이고, 18은 9로 나누어 떨어지므로 18은 하샤드 수입니다. 자연수 x를 입력받아 x가 하샤드 수인지 아닌지 검사하는 함수, solution을 완성해주세요.

function solution(x) {
    var answer = true;

    var sumOfDigits = 0;
    var num = x;

    while (num > 0) {
        sumOfDigits += num % 10;
        num = Math.floor(num / 10);
    }

    if (x % sumOfDigits !== 0) {
        answer = false;
    }

    return answer;
}

✏️풀이

변수 answer를 true로 초기화합니다. 이 변수는 x가 하샤드 수인지 아닌지를 나타내는 불리언 값입니다.

변수 sumOfDigits를 0으로 초기화합니다. 이 변수는 x의 각 자릿수의 합을 저장할 것입니다.

변수 num을 x로 초기화합니다. 이 변수는 각 자릿수의 합을 계산하기 위해 사용됩니다.

while 반복문을 사용하여 num이 0보다 클 때까지 다음 단계를 수행합니다.

sumOfDigits에 num의 일의 자리 숫자인 num % 10을 더합니다. 이는 num의 가장 오른쪽 자릿수를 구하는 방법입니다.

num을 10으로 나누어 가장 오른쪽 자릿수를 없앱니다. 이를 위해 Math.floor(num / 10)을 사용합니다.

x가 하샤드 수인지 아닌지를 판별합니다. x를 sumOfDigits로 나누고 나머지가 0이 아닌 경우에는 x가 하샤드 수가 아니므로 answer를 false로 설정합니다.

answer를 반환합니다.

728x90
반응형
다쭐◠‿◠