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