문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 함수를 작성해주세요.
제한 조건
입출력 예
answers | return |
---|---|
[1,2,3,4,5] | [1] |
[1,3,2,4,2] | [1,2,3] |
입출력 예 설명
입출력 예 #1
따라서 가장 문제를 많이 맞힌 사람은 수포자 1입니다.
입출력 예 #2
규칙에 따른 간단한 구현 문제입니다.
차근차근 풀어보겠습니다.
계획 1 - 수포자들의 규칙에 따른 점수를 계산합니다
// 규칙들
const rules = [[1, 2, 3, 4, 5], [2, 1, 2, 3, 2, 4, 2, 5], [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]];
// 규칙에 따른 점수들
const scores = rules.map((rule) => {
// 점수 계산
const score = answers.reduce((m, answer, i) => (
m += answer == rule[i % rule.length] ? 1 : 0
), 0);
// 반복문 안에서 최고 점수를 갱신합니다.
maxScore = Math.max(maxScore, score);
return score;
});
핵심 구현 부분이죠.
별다른 설명은 필요없을 거라 생각합니다.
계획 2 - 최고 점수인 수포자들만 모아서 배열에 담아 리턴합니다.
return scores.reduce((m, score, i) => {
// 수포자의 점수가 최고 점수일 때
if (score == maxScore) {
m.push(i + 1);
}
return m;
}, []);
function solution(answers) {
// 최고 점수 변수
let maxScore = 0;
// 계획 1 - 수포자들의 규칙에 따른 점수를 계산합니다
const rules = [[1, 2, 3, 4, 5], [2, 1, 2, 3, 2, 4, 2, 5], [3, 3, 1, 1, 2, 2, 4, 4, 5, 5]];
const scores = rules.map((rule) => {
// 점수 계산
const score = answers.reduce((m, answer, i) => (
m += answer == rule[i % rule.length] ? 1 : 0
), 0);
// 반복문 안에서 최고 점수를 갱신합니다.
maxScore = Math.max(maxScore, score);
return score;
});
// 계획 2 - 최고 점수인 수포자들만 모아서 배열에 담아 리턴합니다.
return scores.reduce((m, score, i) => {
if (score == maxScore) {
m.push(i + 1);
}
return m;
}, []);
}