Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

재귀 함수로 JavaScript 중첩 배열의 합계 구하기

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이 출력되는 것을 확인할 수 있습니다. 이처럼 재귀 함수를 사용하면 중첩 깊이가 몇 단계든 상관없이 유연하게 대응할 수 있다는 장점이 있습니다.