function solution(answers) {
let answer = [];
let supo1 = [1, 2, 3, 4, 5];
let supo2 = [2, 1, 2, 3, 2, 4, 2, 5];
let supo3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
let answerCount = [0, 0, 0];
for (let i = 0; i < answers.length; i++) {
if (answers[i] === supo1[i % supo1.length]) answerCount[0]++;
if (answers[i] === supo2[i % supo2.length]) answerCount[1]++;
if (answers[i] === supo3[i % supo3.length]) answerCount[2]++;
}
let max = Math.max(...answerCount);
for (let i = 0; i < answerCount.length; i++) {
if (answerCount[i] === max) answer.push(i + 1);
}
return answer;
}
중고등 과정을 공부할 때 가장 많이 듣던 '문제 속에 답이 있다' 는 말이 코딩에서도 통할 줄은 몰랐다.
하지만 이 문제는 정말 문제 속에 답이 있다.
각자의 수포자가 문제를 찍는 방식을 살펴보면 일정한 패턴이 반복되고 있다.
1번 수포자는 1, 2, 3, 4, 5 가 반복, 2번 수포자는 2, 1, 2, 3, 2, 4, 2, 5 가 반복, 3번 수포자는 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 가 계속 반복된다.
따라서 먼저 이 반복되는 패턴을 배열로 구현, 문제마다 반복되는 답을 입력할 수 있도록 하였다.
또한 answerCount 배열을 선언, 인자를 3개 넣어 수포자 각자의 경우에서 정답을 맞친 횟수를 카운트 할 수 있게 했다.
이후 반복문을 통해 answer 과 수포자의 답을 비교하는 과정을 거친다.
조건문을 통해 답이 맞는지 판단, 맞으면 해당 수포자의 정답 횟수를 ++ 시키는 과정인데, 생각해볼 포인트로는
supo1[i % supo1.length]
이 부분이 될 것이다.
문제는 제한 조건에 따라 최대 10,000 개까지 입력되지만 우리가 수포자들의 답안 패턴을 10,000개까지 입력할 수는 없다. 해서 반복되는 특성을 활용하기 위해 현재 인덱스 i 를 반복 패턴의 길이 supoN.length 로 나눈 나머지값을 활용하여 같은 패턴을 계속 반복 활용할 수 있도록 했다.
이 과정을 모두 거치고 나면 answerCount 에 각각의 정답 횟수가 입력된다.
예시로 주어진 1,2,3,4,5 를 예시로 하면 [3, 0, 0] 이 될 것이다.
먼저 제일 문제를 많이 맞춘 횟수를 구하기 위해 max 변수의 값을 구한다. 여기서 Math.max 메서드와 스프레드 기법이 활용되었다.
이후 answerCount의 길이, 즉 3명분치의 반복을 통해 문제를 맞춘 최대 횟수와 수포자 각각의 정답 횟수를 비교한다.
비교 후 조건이 성립하면 answer 에 해당 수포자의 인덱스 + 1 (수포자들의 번호는 1번부터 시작하기에 이를 맞추기 위함이다) 을 push 한다.
단순히 max의 인덱스를 구하면 되는거 아니야? 라고 생각할 수 있지만, 제한 조건을 잘 살펴보면 '가장 많은 문제를 맞춘 사람이 여럿일 경우' 라는 말이 있다.
단순히 한명만 구하는 문제가 아니라는 말이기에 애초에 주어진 answer 도 배열의 형태로 주어졌고, 모두가 동일한 횟수의 답을 맞춘 경우, 예시 2번의 경우도 생각을 해야 한다.
해서 이와 같은 반복문 과정을 거치고 난 후의 answer을 반환한다.
예시 2번, 예시 1번 순으로 시행한 결과이다.
[C++] 달리기 경주 - 프로그래머스 (0) | 2024.12.10 |
---|---|
[JS] 덧칠하기 - 프로그래머스 (0) | 2024.11.27 |
[JS] 2016년 - 프로그래머스 (0) | 2024.11.22 |
[JS] 명예의 전당(1) - 프로그래머스 (0) | 2024.11.21 |
[JS] 콜라 문제 - 프로그래머스 (0) | 2024.11.20 |