JavaScript에서 숫자로 이루어진 중첩 배열(nested array)을 입력받아, 배열 안에 포함된 모든 숫자의 합계를 반환하는 함수를 작성해야 하는 경우가 있습니다. 이때 재귀(recursion)를 활용하면 깊이에 상관없이 간단하고 효율적으로 문제를 해결할 수 있습니다.
문제 상황
예를 들어, 다음과 같이 배열 안에 또 다른 배열이 여러 겹으로 중첩된 구조가 있다고 가정해 보겠습니다.
const arr = [2, 5, 7, [ 4, 5, 4, 7, [ 5, 7, 5 ], 5 ], 2];
배열 내부에는 숫자와 함께 하위 배열이 섞여 있으며, 하위 배열 안에 또 다른 하위 배열이 존재할 수도 있습니다. 재귀 함수는 각 요소를 순회하다가 배열을 만나면 자기 자신을 다시 호출하여 그 합계를 더하는 방식으로 동작합니다.
구현 코드
다음은 재귀를 사용하여 중첩 배열의 모든 숫자 합계를 계산하는 코드입니다.
const arr = [2, 5, 7, [
4, 5, 4, 7, [
5, 7, 5
], 5
], 2];
const calculateSum = (arr, query) => {
let count = 0;
for(let i = 0; i < arr.length; i++){
if(Array.isArray(arr[i])){
count += calculateSum(arr[i], query);
continue;
};
count += arr[i];
};
return count;
};
console.log(calculateSum(arr));코드 설명
동작 원리를 단계별로 살펴보면 다음과 같습니다.
1. 초기화: 합계를 저장할 변수 count를 0으로 선언합니다.
2. 요소 순회: for 반복문으로 배열의 각 요소를 하나씩 확인합니다.
3. 배열 판별: Array.isArray() 메서드로 현재 요소가 배열인지 검사합니다. 배열이라면 해당 요소를 인자로 넘기며 calculateSum을 재귀 호출하고, 그 결과값을 count에 더한 뒤 continue로 다음 요소로 넘어갑니다.
4. 숫자 누적: 배열이 아닌 일반 숫자라면 그 값을 바로 count에 더합니다.
5. 결과 반환: 모든 요소를 처리하면 최종 합계를 반환합니다. 재귀 호출 시 하위 배열의 합계도 동일한 방식으로 계산되어 상위 합계에 누적됩니다.
실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 출력 결과가 표시됩니다.
58
모든 중첩 배열 속 숫자(2 + 5 + 7 + 4 + 5 + 4 + 7 + 5 + 7 + 5 + 5 + 2)가 정확히 더해진 값인 58이 출력되는 것을 확인할 수 있습니다. 이처럼 재귀 함수를 사용하면 중첩 깊이가 몇 단계든 상관없이 유연하게 대응할 수 있다는 장점이 있습니다.