개요
- 코드를 작성하면서도 이것보다 짧고 확실한 코드가 분명 있겠다 확신함...
- 나머지를 구해 인덱스를 활용하는 방법을 생각 못하고 배열을 복제하여 따질 생각한 것부터 코드가 길어진 원인
- 정답을 맞힌 배열에서 sort로 맞힌 사람을 나열하려 했는데 이 또한 두 번째 원인
- 하나하나 보면 그동안 익힌 메서드들을 나름 자연스레 써먹은 모습인데 전체적으로 봤을 때는 그저 과해보인다.
JS CODE (1) - 내 코드
function sos(answers) {
const answer1 = { list: [1, 2, 3, 4, 5], length: 5 };
const answer2 = { list: [2, 1, 2, 3, 2, 4, 2, 5], length: 8 };
const answer3 = { list: [3, 3, 1, 1, 2, 2, 4, 4, 5, 5], length: 10 };
const answers_arr = [answer1, answer2, answer3];
const answer_len = answers.length;
const result = answers_arr.map((obj) => {
let n = parseInt(answer_len / obj.length) + 1; // 자바스크립트에서 몫구하기 에러
let new_list = [];
for (let i = 0; i < n; i++) {
new_list = new_list.concat(obj.list); // concat 에러
}
let sum = 0;
for (let i = 0; i < answer_len; i++) {
if (answers[i] == new_list[i]) sum++;
}
return sum;
});
for (let i = 1; i < 4; i++) {
result[i - 1] = [i, result[i - 1]];
}
result.sort((a, b) => {
return b[1] - a[1];
});
if (result[0][1] == result[1][1]) {
if (result[1][1] == result[2][1]) {
return result.map((arr) => arr[0]);
} else {
return [result[0][0], result[1][0]];
}
} else {
return [result[0][0]];
}
}
console.log(sos([1, 2, 3, 4, 5]));
- js 에서 몫을 구할 때 pareInt 메서드 안써주면 소숫점으로 나옴
- concat 메서드는 기존 배열을 변경하지 않고 새로운 메서드를 반환하기 때문에 갱신이 필요함
JS CODE (2) - 프로그래머스 우수 풀이
function solution(answers) {
var answer = [];
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;
var max = Math.max(a1c,a2c,a3c);
if (a1c === max) {answer.push(1)};
if (a2c === max) {answer.push(2)};
if (a3c === max) {answer.push(3)};
return answer;
}
- 위에 언급한대로, '반복'에 초점을 맞춰 인덱스만 반복하도록 함
- if문을 차례대로 진행시켜 따로 sort메서드를 사용할 필요 없게 함