클릭해서 문제 전체 보기🔼
// 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
function solution(answers) {
let num1Arr = [1,2,3,4,5];
let num2Arr = [2,1,2,3,2,4,2,5];
let num3Arr = [3,3,1,1,2,2,4,4,5,5];
let scoreMap = new Map();
let result = [];
for(i=0; i<3; i++) {
scoreMap.set(i+1, 0);
}
answers.forEach(ele => {
let num1 = num1Arr.shift();
let num2 = num2Arr.shift();
let num3 = num3Arr.shift();
if(ele == num1) scoreMap.set(1, scoreMap.get(1)+1);
if(ele == num2) scoreMap.set(2, scoreMap.get(2)+1);
if(ele == num3) scoreMap.set(3, scoreMap.get(3)+1);
num1Arr.push(num1);
num2Arr.push(num2);
num3Arr.push(num3);
})
let scoreArr = [...scoreMap].sort((a, b) => b[1] - a[1]);
if(scoreArr[0][1] > scoreArr[1][1]) return [scoreArr[0][0]];
else if(scoreArr[1][1] > scoreArr[2][1]) {
result.push(scoreArr[0][0], scoreArr[1][0]);
return result;
} else {
result.push(scoreArr[0][0], scoreArr[1][0], scoreArr[2][0]);
return result;
}
}
📢 풀이 설명
이 문제를 풀면서 2가지에 대해 고민했다.
1. 수포자마다 찍는 패턴의 개수가 각자 다른데, 이걸 어떻게 한꺼번에 사용해야할까?
2. 코드도 너무 길고, 반복되는 코드가 너무 많아 효율적이지 않은 것 같다.
나는 1번을 맨 앞 요소를 shift해서 맨 뒤에 갖다붙이는 식으로 해결했다. 찍은 답의 배열을 계속 유지시키는 방법이었다.
다른 사람의 풀이에서 발견한 방법으로는 answer의 idx % [찍은 배열 길이]
이 있었다. 이 방법을 사용하면 shift + push
과정이 없어서 더 효율적이었다.
또, 나는 if를 사용해 하나하나 비교했는데 이 방법 대신 filter를 사용해 일치하는 것만 골라내니까 코드가 훨씬 간결해졌다.
2번의 문제는 1번의 해결법 + 가장 큰 값 비교방식을 바꾸면 해결된다.
가장 큰 값을 하나하나 비교하지말고, Math.max()
로 값 뽑은 뒤 수포자 1번부터 맞은 개수와 Math.max()
를 비교해서 일치하면 추가하면 된다.
JS의 메서드들을 잘 쓰면 코드의 가독성과 효율성이 올라감을 느꼈다. 메서드 익히기는 정말 중요해..