문제 설명
수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 함수를 작성해주세요.
제한 조건
입출력 예
작성 코드
const solution = (answers) => {
const losers = [
[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5]
];
const maxNumbers = []; /* 루저들의(수포자) 문제 맞힌 수*/
/* 맞힌 문제 카운트하기 */
for(const loser of losers) {
maxNumbers.push(answers.reduce((acc, cur, idx) => {
cur === loser[idx % loser.length] ? acc++ : acc;
return acc;
}, 0));
}
/* 제일 많이 맞힌 루저 찾기 */
const result = maxNumbers.reduce((acc, cur, idx) => {
cur === Math.max(...maxNumbers) ? acc.push(idx+1) : acc;
return acc;
}, []);
return result;
}
정리
reduce(accumulator, currentValue, index, array)
accumulator - 배열의 누적 값
currentValue - 현재 값
index - 현재 배열의 인덱스
array - 배열 원본
reduce는 두 번째로 인자로 현재 인덱스에 해당하는 객체를 반환해주기 때문에 정답들의 순서대로 반환되는 수포자들의 값들과 비교하여 accumulator에 카운트하게 했다.
loser[idx % loser.length] ..?
수포자1의 길이가 5이고 정답 리스트의 인덱스를 0이라고 해보자 그러면 나머지로 0이 나온다. 0 % 5 = 0 이니까..
그럼 정답의 개수가 20개일 경우 20번 반복인데.. 수포자1의 길이는 고정이니까
0~19 % 5 = 0~4..
수포자1의 객체가 [1,2,3,4,5] 이므로
1,2,3,4,5를 총 4번 반복해서 정답과 비교할거임
이걸 하고 나면 가장 많이 맞힌 수포자를 구하는건 쉽다.
카운트된 수포자들을 reduce 함수로 가장 많이 맞힌 수포자를 찾고
첫 번째 파라미터를 list타입으로 현재 수포자의 index + 1해서 return만 해주면 끝.
일하면서 reduce 써보려 해도 어렵고 귀찮아서 안 쓸려했는데 이렇게 쓸줄은 몰랐다,, filter 안 쓰고 reduce로 다 커버 가능할 듯 싶다 ㅎㅎ 개꿀띵🤪