코딩테스트 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를 반환합니다.