출처)https://school.programmers.co.kr/learn/courses/30/lessons/42840#
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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) {
let one=[1,2,3,4,5];
let two=[2, 1, 2, 3, 2, 4, 2, 5];
let three = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
let answer=[]
while (one.length < answers.length) {
one = one.concat(one.slice(0, answers.length - one.length));
}
while (two.length < answers.length) {
two = two.concat(two.slice(0, answers.length - two.length));
}
while (three.length < answers.length) {
three = three.concat(three.slice(0, answers.length - three.length));
}
let oneAnswer=0
let twoAnswer=0
let threeAnswer=0
answers.forEach((el,idx)=>{
if(el===one[idx]){oneAnswer++}
if(el===two[idx]){twoAnswer++}
if(el===three[idx]){threeAnswer++}
})
console.log(oneAnswer,twoAnswer,threeAnswer)
let maxAnswer = Math.max(oneAnswer, twoAnswer, threeAnswer);
if (oneAnswer === maxAnswer) answer.push(1);
if (twoAnswer === maxAnswer) answer.push(2);
if (threeAnswer === maxAnswer) answer.push(3);
return answer;
}
먼저 1번 수포자, 2번 수포자, 3번 수포자가 각각 정답을 찍는 수열의 최소 패턴을 정의한다.
출제되는 문제(answers 의 길이)의 수가 얼마나 길어질지 모르기 때문에 세 학생의 답안에 해당하는 배열의 길이를 answers 길이와 같게 만들어 주어야 한다. 그것을 위해 while 문을 활용, 각 학생이 정답을 찍는 패턴은 유지하면서 주어진 answers 배열의 길이에 맞춰야 하기 때문에 concat을 사용하여 붙여주며 이때 붙이는 부분은 slice 로 만든다.
slice에서 두번째 인자가 배열 끝 index보다 커질 경우 자동으로 마지막 요소까지 선택이 되기 때문에 문제가 되지 않는다.
그 이후엔 정답 배열과 각 학생의 답안 배열을 비교해서 각 학생의 정답 개수를 세어주기만 하면 된다.
마지막으로 Math.max로 최고점을 구해낸 다음 해당 최고점을 가진 학생을 answer 배열에 넣으면 끝.