문제 개요
JavaScript에서 리터럴 값으로 이루어진 배열과 숫자 n을 입력받아, 배열을 정확히 n개의 하위 배열(청크)로 나누는 함수를 작성해야 합니다. 이때 n은 항상 배열의 길이보다 작거나 같다고 가정합니다.
예를 들어, 입력 배열이 다음과 같다면 −
const arr = [1,2,3,4,5,6,7,8,9,10];
const n = 3;
출력 결과는 다음과 같아야 합니다 −
const output = [[1,2,3],[4,5,6],[7,8,9,10]];
해결 방법
핵심 아이디어는 각 청크의 크기를 배열 길이 ÷ 청크 개수(n)로 계산한 뒤, slice() 메서드를 반복적으로 사용해 원본 배열을 잘라내는 것입니다.
코드 구현
이를 구현한 코드는 다음과 같습니다 −
const arr = [1,2,3,4,5,6,7,8,9,10];
const n = 3;
const divideIntoChunks = (arr, count) => {
const res = [];
const size = arr.length / count;
let ind = 0;
while (ind < arr.length) {
res.push(arr.slice(ind, ind += size));
};
return res;
};
console.log(divideIntoChunks(arr, n));
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9, 10 ] ]
코드 동작 원리
1. 결과를 담을 빈 배열 res를 생성합니다.
2. size 변수에 각 청크가 가져야 할 요소 수(배열 길이를 청크 개수로 나눈 값)를 저장합니다. 위 예제에서는 10 ÷ 3 ≈ 3.33이 됩니다.
3. while 루프를 돌며 현재 인덱스부터 다음 인덱스까지 slice()로 잘라낸 조각을 결과 배열에 하나씩 추가합니다.
4. 마지막 청크에는 나누고 남은 나머지 요소들이 모두 포함되므로, 위 예제의 세 번째 청크는 4개의 요소([7, 8, 9, 10])를 갖게 됩니다.
이 방식은 청크 크기 계산 시 소수점이 발생하더라도 남은 요소들이 자동으로 마지막 그룹에 배정되기 때문에, 균등하지 않은 분할도 별도 처리 없이 자연스럽게 해결할 수 있다는 장점이 있습니다.