function solution(answers) {
const bestSupo = [];
let grade1 = 0;
let grade2 = 0;
let grade3 = 0;
const n = answers.length;
for (let i = 0; i < n; i++) {
let answer = answers[i];
// i번 문제에 대한 수포자들의 답
let supo1 = [1, 2, 3, 4, 5][i % 5];
let supo2 = [2, 1, 2, 3, 2, 4, 2, 5][i % 8];
let supo3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5][i % 10];
if (supo1 === answer) grade1++;
if (supo2 === answer) grade2++;
if (supo3 === answer) grade3++;
}
const bestResult = Math.max(grade1, grade2, grade3);
if (grade1 === bestResult) bestSupo.push(1);
if (grade2 === bestResult) bestSupo.push(2);
if (grade3 === bestResult) bestSupo.push(3);
return bestSupo;
}
나머지를 이용해서 문제에 대한 각 수포자들의 답안을 구했는데, 뭔가 깔끔한 느낌이 없는 듯해서... 다른 풀이를 참고해봤다.
var a1 = [1, 2, 3, 4, 5];
var a2 = [2, 1, 2, 3, 2, 4, 2, 5]
var a3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
var a1c = answers.filter((a, i) => a === a1[i % a1.length]).length;
var a2c = answers.filter((a, i) => a === a2[i % a2.length]).length;
var a3c = answers.filter((a, i) => a === a3[i % a3.length]).length;
각 수포자들의 답안 패턴 배열을 변수로 선언해준 것까지는 동일한데, filter
메소드를 사용한 점이 특징적이었다.
filter
를 사용해 a1c
, a2c
, a3c
변수에 각 수포자들이 맞힌 문제(의 답안)만을 새로운 배열로 반환.length
를 통해 맞힌 문제의 개수를 셈이후로 Math.max
를 이용한 것 등은 내 풀이와 비슷했다.
위 풀이에 대한 댓글에 어떤 분이 answers
배열을 세 번에 나눠서 탐색하기 때문에 성능 이슈가 발생할 수 있을 것 같다는 말씀을 하셨다.
그냥 궁금해서 시간을 비교해봤는데, 거의 모든 테스트 케이스에서 내 풀이처럼 for문을 한 번 도는 게 더 빨랐지만 9, 11, 12, 14번 케이스 같은 경우에는 내 풀이가 눈에 띄게 오래 걸려서... 뭐가 문제일까 궁금했다 🤔
추가로 풀이 마지막에 세 수포자의 점수를 비교해서 배열에 push
하는 부분에 반복문을 사용하는 게 좋을 것 같다는 의견이 있었다. 그렇게 안 쓰긴 했지만 완전 동의! 🙆🏻♀️
https://programmers.co.kr/learn/courses/30/lessons/42840?language=javascript