전체코드
function solution(answers) {
const studentArr = [
[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
];
const result = [];
studentArr.reduce((acc, cur, i) => {
for (let i = 0; i < answers.length; i++) {
answers[i] === cur[i%cur.length] ? (acc += 1) : acc;
}
result.push(acc);
return (acc = 0);
}, 0);
return result.reduce((acc, cur, i) => {
if (Math.max(...result) <= cur) acc.push(i + 1);
return acc;
}, []);
}
문제풀이
1.학생들의 찍는 방식을 2차배열로 정리한다.
const studentArr = [
[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
];
2.reduce와 for을 이용하여 각 학생의 점수를 result에 넣는다.
const result = [];
studentArr.reduce((acc, cur, i) => {
for (let j = 0; j < answers.length; j++) {
answers[j] === cur[j%cur.length] ? (acc += 1) : acc;
}
result.push(acc);
return (acc = 0);
}, 0);
- acc: i번째 학생 점수 (초기값 0으로 설정)
- cur: i번째 학생의 찍는 방식
- for 반복문으로 답지 배열 (answers)과 학생의 찍은 방식(cur)을 대조하여 답이 같으면 학생의 점수(acc)를 1씩 증가 시킨다.
-->cur[j%cur.length]: 학생의 찍는 패턴은 똑같으므로 문제 번호(j)에 학생의 찍는 방식 배열의 길이(cur.length)를 나눈 나머지([j%cur.length])번째 값이 학생이 해당 문제(j)에 적은 답이다.
- 반복문을 완료하면 학생의 점수를 모아두는 배열(result)에 넣고 학생의 점수(acc)를 다시 0으로 만든다.
3.result에 있는 점수의 최대값을 찾아 값을 return한다.
return result.reduce((acc, cur, i) => {
if (Math.max(...result) === cur) acc.push(i + 1);
return acc;
}, []);
- acc: solution 함수의 return 값
- cur: i번째 학생의 점수
- Math.max(...result): 학생들 중 최고 점수
- 학생들 중 최고 점수와 i번째 학생의 점수를 비교하여 같으면 acc에 i번째 학생을 넣는다.(acc.push(i + 1))
여담
