수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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) {
const answer = [];
const firstStudent = [1,2,3,4,5];
const secondStudent = [2,1,2,3,2,4,2,5];
const thirdStudent = [3,3,1,1,2,2,4,4,5,5];
const firstStudentAnswerCount = answers.filter((answer, index) =>
answer === firstStudent[index % firstStudent.length]).length
const secondStudentAnswerCount = answers.filter((answer, index) =>
answer === secondStudent[index % secondStudent.length]).length
const thirdStudentAnswerCount = answers.filter((answer, index) =>
answer === thirdStudent[index % thirdStudent.length]).length
const maxArr = [firstStudentAnswerCount,secondStudentAnswerCount,thirdStudentAnswerCount]
for(let i =0 ; i < maxArr.length; i++) {
const max = Math.max (firstStudentAnswerCount,secondStudentAnswerCount,thirdStudentAnswerCount)
if (maxArr[i] >= max) {
answer.push(i+1)
}
}
return answer;
}
이번에 가장 막혔던 부분은 answers의 길이가 학생의 답 패턴 배열보다 무조건 긴데 이걸 어떻게 answers 끝까지 비교할 것인가였다.
원래는 Math.ceil(answers.length/studentAnswer.length)
를 해서 나온 값을 studentAnswer에 붙여서 for문을 할까라고 막연히 생각하다가 실현하기 힘들다는 생각이 들어서 포기했다.
계속 아이디어가 생각이 안 나서 결국 찾아봤는데 나머지 값을 구해서 반복적으로 answer를 비교하는 방법이 있었다. 역시 사람들이 똑똑하다...
그 이후로는 문제 풀이가 매끄럽게 흘러갔다.
마지막의 for문의 경우 지금은 학생 수가 3명이고 문제 자체도 3명으로 고정되어 있지만 학생이 늘어난다면 for문이 더 맞지 않을까해서 for문을 사용하게 되었다.
전체적으로 학생 수가 늘어날 경우를 감안해서 작성한 코드는 아니지만 만약에 학생 수도 늘어난다면 많은 부분을 고쳐야 할 것 같다. filter도 지금처럼 사용하기는 힘들겠고 maxArr도 지금처럼 직접 요소를 주는게 아닌 Array.push를 써야겠다.
프로그래머스 분류에 완전탐색이라고 되어 있던데 조만간 완전탐색에 대해 알아봐야겠다.