내 접근 방식
사람마다 규칙에 따라 답이 반복되는데 이걸 계산식으로 표현할수 있나...?
어떻게 하지..? 생각이 안났다.
그래서 정답 리스트를 만들어버렸다.
while (per3.length < answers.length) {
per3.concat(per3);
}
이렇게하면 정답 길이근처만큼 개인의 답이 확장되겠지? but 너무 메모리를 크게 사용한다.
이 문제의 핵심은 "%"
나머지 기호를 잘 쓸줄 아느냐.
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++) { // answers[] 를 한번 돌리게 하는 것도 포인트 !
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); // push도 포인트 !
}
return answer;
}
다른 답
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];
// filter((a,i) 이부분 !!
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;
}
filter 부분
filter의 callback function()의 첫번째 인자는 처리할 현재 요소, 두번째 인자는 처리할 요소의 인덱스
answers.filter(a, i) { function(a, i){
return a === a1[i% a1.length].length;
}
}
answers.filter((a, i) => a === a1[i% a1.length]).length;
array에 filter를 거는 것이기 때문에 array의 첫 요소, array의 첫 인덱스부터 필터링하게 된다.
'CS > 알고리즘' 카테고리의 다른 글
종이접기 [프로그래머스] 실패 (0) | 2020.07.14 |
---|---|
탑 _프로그래머스 (0) | 2020.05.06 |
k번째수 (0) | 2020.05.04 |
완주하지 못한 선수. (0) | 2020.05.04 |
크레인 인형뽑기 게임 (0) | 2020.04.24 |