function solution(answers) {
let soopo = {
1 : [1, 2, 3, 4, 5],
2 : [2, 1, 2, 3, 2, 4, 2, 5],
3 : [3, 3, 1, 1, 2, 2, 4, 4, 5, 5],
};
// 순서대로 수포자 1,2,3의 점수를 의미
let score = [0, 0, 0];
for(let i = 1; i <= 3; i++){
let num = answers.length / soopo[i].length;
// repeat() 메서드는 내부 값이 알아서 정수형으로 바뀐다.
// 정답과 비교를 위해 최소한 answers 길이만큼은 늘려준다.
soopo[i] = soopo[i].join("").repeat(num + 1).split("").map((item) => Number(item));
answers.forEach((item, index) => {
if(soopo[i][index] === item){
// score는 0번 인덱스가 1번 수포자이기 때문에 인덱스를 조절해줘야한다.
score[i - 1] += 1;
}
})
}
// 가장 많이 맞은 점수를 찾는다
let max = Math.max(...score);
let ans = [];
// max가 중복되는 사람이 있으면 그 사람들을 ans에 넣어준다
score.forEach((item, index) => {
if(item === max){
ans.push(index + 1);
}
})
return ans;
}
수포자 번호에 따라 배열을 하나씩 만드는 방법은 for문 내부에서 사용하기 어려워서
하나의 객체에 모든 수포자의 정보를 넣어놨다.
answers와 수포자의 답안을 비교하기 위해서 수포자의 답안을 answers의 길이보다 크게 만들어줬는데,
아마 이 부분에서 시간 소요가 꽤 된 것 같다.
function solution(answers) {
var answer = [];
const man1 = [1, 2, 3, 4, 5];
const man2 = [2, 1, 2, 3, 2, 4, 2, 5];
const man3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
let count = [0, 0, 0];
for(let i = 0; i < answers.length; i++) {
if(answers[i] == man1[i % man1.length]) count[0]++;
if(answers[i] == man2[i % man2.length]) count[1]++;
if(answers[i] == man3[i % man3.length]) count[2]++;
}
const max = Math.max(count[0], count[1], count[2]);
for(let i = 0; i < count.length; i++) {
if(max == count[i]) answer.push(i + 1);
}
return answer;
}
필자가 시간 소요가 됐다고 말한 부분을 간단하게 해결하신 분이 계셨다.
수포자 답안의 인덱스를
man1[i % man1.length]
이런 식으로 작성하셨는데, 이러면 굳이 repeat로 수포자 답안을 늘릴 필요없이
간단하게 반복을 구현할 수 있다.
그 외 로직은 필자와 비슷하다고 생각하므로 설명 생략!