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

JavaScript로 중첩 배열의 재귀 곱셈 구현하기

중첩된 숫자 배열 안에 null, undefined, false 같은 거짓(falsy) 값과 문자열이 섞여 있는 경우가 있습니다. 이때 배열에 실제로 존재하는 숫자 값들만 곱한 결과를 반환하는 JavaScript 함수를 작성해야 합니다.

특히 주의할 점은 배열에 0이 포함되어 있을 때입니다. 0을 그대로 곱하면 전체 결과가 0이 되어버리기 때문에, 0 역시 다른 거짓 값과 마찬가지로 무시하고 계산에서 제외해야 합니다.

해결 방법

핵심 아이디어는 재귀(recursion)를 활용하는 것입니다. 배열의 각 요소를 순회하면서 요소가 배열이면 자기 자신을 다시 호출하고, 그렇지 않으면 해당 값을 곱합니다. 이때 거짓 값은 논리 OR 연산자(||)를 사용해 1로 대체함으로써 곱셈 결과에 영향을 주지 않도록 처리합니다.

예제 코드

const arr = [1, 5, 2, null, [
    2, 5, null, undefined, false, 5, [
        1, 3, false, 0, 2
    ], 4, 2, false
], 4, 6, 0
];
const recursiveMultiplication = arr => {
   let prod = 1;
   for(let i = 0; i < arr.length; i++){
      if(Array.isArray(arr[i])){
         prod *= recursiveMultiplication(arr[i]);
      }else{
         prod *= arr[i] || 1;
      };
   };
   return prod;
};
console.log(recursiveMultiplication(arr));

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

576000

코드 설명

동작 원리를 단계별로 살펴보면 다음과 같습니다.

  • 초기값 설정: 곱셈의 항등원인 1로 변수 prod를 초기화합니다.
  • 배열 판별: Array.isArray() 메서드로 현재 요소가 배열인지 확인하고, 배열이라면 재귀 호출로 내부 배열의 곱을 먼저 계산합니다.
  • 거짓 값 처리: arr[i] || 1 표현식 덕분에 null, undefined, false, 0처럼 falsy로 평가되는 값은 모두 1로 치환됩니다. 따라서 곱셈 결과가 변하지 않고, 0으로 인해 전체 결과가 0이 되는 문제도 자연스럽게 방지됩니다.

예제 배열에서 실제 유효한 숫자는 1 × 5 × 2 × (2 × 5 × 5 × (1 × 3 × 2) × 4 × 2) × 4 × 6 = 576000이며, 코드 실행 결과와 정확히 일치합니다.