문제 정의
중첩된(nested) 배열을 입력받아, 배열 안에 포함된 모든 요소의 총 개수, 즉 '깊은 카운트(deep count)'를 반환하는 JavaScript 함수를 작성해야 합니다. 단순히 최상위 레벨의 요소만 세는 것이 아니라, 여러 겹으로 중첩된 하위 배열의 요소까지 모두 포함하여 개수를 구해야 합니다.
입력 예시
const arr = [1, 2, [3, 4, [5]]];
출력 예시
const output = 7;
배열을 레벨별로 나누어 살펴보면 다음과 같습니다.
- 레벨 1: 1, 2, [3, 4, [5]] → 3개
- 레벨 2: 3, 4, [5] → 3개
- 레벨 3: 5 → 1개
각 레벨의 요소 개수를 모두 합하면 3 + 3 + 1 = 7이 되므로, 이 배열의 깊은 카운트는 7입니다.
예제 코드
다음은 위 문제를 해결하는 코드입니다.
const arr = [1, 2, [3, 4, [5]]];
const deepCount = (arr = []) => {
return arr
.reduce((acc, val) => {
return acc + (Array.isArray(val) ? deepCount(val) : 0);
}, arr.length);
};
console.log(deepCount(arr));
코드 설명
이 코드의 핵심 동작 원리는 다음과 같습니다.
Array.prototype.reduce()메서드를 사용해 배열의 각 요소를 순회하면서 누적값(acc)을 계산합니다.- 초기값으로
arr.length, 즉 최상위 레벨의 요소 개수를 지정하여 기본 개수를 먼저 더합니다. - 순회 중인 요소가 배열인지
Array.isArray()로 확인하고, 배열이라면 해당 함수를 재귀적으로 호출하여 내부 요소의 개수를 추가로 더합니다. - 일반 값이라면 추가될 개수는 0이므로 누적값에 영향을 주지 않습니다.
이처럼 재귀 호출을 활용하면 아무리 깊게 중첩된 배열이라도 모든 레벨의 요소를 빠짐없이 셀 수 있습니다.
실행 결과
7