수포자는 수학을 포기한 사람의 준말입니다. 수포자 삼인방은 모의고사에 수학 문제를 전부 찍으려 합니다. 수포자는 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 supoja = [
[1, 2, 3, 4, 5],
[2, 1, 2, 3, 2, 4, 2, 5],
[3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
];
const supojaLength = [supoja[0].length, supoja[1].length, supoja[2].length];
const num = [0, 0, 0];
const answer = [];
for (let i = 0; i < answers.length; i++) {
for (let j = 0; j < supojaLength.length; j++) {
if (answers[i] === supoja[j][i % supojaLength[j]]) num[j]++;
// answers[0] === supoja[0][0]
// answers[0] === supoja[0][1]
// answers[0] === supoja[0][2]
// 위와 같이 비교하여 서로 같은 값일떄 배열에 count를 + 해준다.
}
}
const maxNum = Math.max(...num); // num배열의 최고값을 구한다.
num.forEach((a, i) => {
if (a === maxNum) {
//a와 maxNum의 값을 비교하여 같으면 answer배열에 +1씩 해준다.
answer.push(i + 1);
}
});
return answer;
}
처음 문제를 봤을 때 부터 이해가 쉽지 않았다. 천천히 읽어 보고서야 사람마다 일정 답을 찍는 패턴(고정된 값)이 있었고, answer의 배열과 비교했을 때 같으면 정답처리 되고 제일 많이 맞힌 사람을 찾는 문제였다.
처음 생각
처음에는 answer의 배열 길이가 짧을 때는 문제가 없지만, 찍는 패턴보다 길어졌을 때 비교가 힘들어져서 그냥 수포자의 배열들을 answer 배열의 길이만큼 늘려주고 비교하려고 했다. 그래서 코드를 써내려 가는데 점점 길어지고 이게 맞나 싶었다.. 결국 풀기는 풀었지만.. 이렇게 풀라고 만든 문제가 아닌 것 같았다. 😂
다른 사람의 코드
위의 풀이가 다른 사람의 코드인데,
if (answers[i] === supoja[j][i % supojaLength[j]]) num[j]++;
부분이 이해가 되질 않았다. 왜 %로 나눠주는지.. 천천히 반복문을 따라가다 보니까 알 수 있었는데,1 % 8
일 때, i가 8이 될 때까지 나머지 값은 i일 것이다.. 그래서 수포자의 배열을 늘리지 않고도(?)확인을 할 수 있었던 것..ㅠ
저 값이 나오는 걸 알고는 있었지만 이렇게도 활용을 할 수 있구나를 알게 되었다..!