< 문제 >
for문 풀이
먼저 문제에서 반복되는 포인트를 찾는다.
ex) 1번수포자는 1, 2, 3, 4, 5가 반복됨.
이렇게 반복되는 규칙을 미리 정의해두고 해당 index에 해당하는 count를 정의해둔다.
그 이후 index를 각 배열의 길이에 맞게 나누어 준다
a1기준 0~4의 index가 나올 수 있고, 5로 나눠줌으로써 가변적인 a1의 길이에 항상 원하는 위치에 index를 바라보도록 해준다.
< 효과 >
0%5=0 / 1%5=1 / 2%5=2 / 3%5=3 / 4%5=4
5%5=0 / 6%5=1 / 7%5=2 / 8%5=3 / 9%5=4
위와같이 a1에 규칙에따라 얼마나 많은 숫자를 찍어도 항상 arr[i % a1.length]가 특정 index를 가리키게하는 효과
그렇게 매개변수로 받아온 arr와 각 a1,a2,a3의 indexr값을 비교한 이후 각 index에 맞게 count에 추가.
그리고 Math.max로 count의 최대값을 구하고,
if조건문을 반복돌면서 최대값인값을 answer에 push해주는 풀이.
이때 push할때는 index는 0부터 시작임으로 0번째일때 1이 들어가도록 i + 1을 push해준다.
function solution(arr) {
let answer = [];
let count = [0, 0, 0];
const a1 = [1, 2, 3, 4, 5];
const a2 = [2, 1, 2, 3, 2, 4, 2, 5];
const a3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
for (let i = 0; i < arr.length; i++) {
if (a1[i] === arr[i % a1.length]) {
count[0] = count[0] + 1;
}
if (a2[i] === arr[i % a2.length]) {
count[1] = count[1] + 1;
}
if (a3[i] === arr[i % a3.length]) {
count[2] = count[2] + 1;
}
}
const max = Math.max(...count);
for (let i = 0; i < count.length; i++) {
if (count[i] === max) {
answer.push(i + 1);
}
}
return answer;
}
console.log(solution([1, 2, 3, 4, 5]));
console.log(solution([1, 3, 2, 4, 2]));
filter 풀이
위의 풀이와 거의 유사하지만 filter메소드를 이용해서 더 적은줄을 사용하여 더 간단하게 풀이
filter돌면서 위와같이 특정 index의 arr와 a1,a2,a3의 값을 비교해서 같은것만 filter해서 그길이를 구하고, 그길이들의 최대값을 Math.max로 구한후
if문으로 max값과 filter된 배열이 같은경우에만 각각 1,2,3을 push 해주는 풀이
function solution(arr) {
let answer = [];
const a1 = [1, 2, 3, 4, 5];
const a2 = [2, 1, 2, 3, 2, 4, 2, 5];
const a3 = [3, 3, 1, 1, 2, 2, 4, 4, 5, 5];
const a1c = arr.filter((item, idx) => item === a1[idx % a1.length]).length;
const a2c = arr.filter((item, idx) => item === a2[idx % a2.length]).length;
const a3c = arr.filter((item, idx) => item === a3[idx % a3.length]).length;
const 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;
}
console.log(solution([1, 2, 3, 4, 5]));
console.log(solution([1, 3, 2, 4, 2]));