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

JavaScript로 중첩 배열 속 숫자들의 곱 구하기

중첩된 배열 안에 숫자뿐만 아니라 falsy 값(0 포함)이나 문자열까지 섞여 있는 경우가 있습니다. 이럴 때 배열에 포함된 숫자 값들만 곱한 결과를 반환하는 JavaScript 함수를 작성해 보겠습니다. 만약 배열에 0이 포함되어 있다면, 0 역시 계산에서 제외해야 합니다.

문제 접근 방식

배열이 여러 겹으로 중첩되어 있기 때문에, 각 요소를 순회하면서 해당 요소가 배열인지 확인하고, 배열이라면 다시 같은 로직을 재귀적으로 호출하는 방식이 가장 효율적입니다. 또한 falsy 값(null, undefined, false, 0 등)은 논리 OR 연산자(||)를 활용해 곱셈에 영향을 주지 않도록 처리할 수 있습니다.

예시 코드

실제 동작하는 코드는 다음과 같습니다 −

const arr = [
   1, 2, null, [
      2, 5, null, undefined, false, 5, [
         1, 3, false, 0, 2
      ], 4, 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));

출력 결과

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

57600

코드 설명

이 함수의 핵심 로직은 다음과 같습니다.

  • 곱셈의 항등원인 1로 초기화된 변수 prod를 선언합니다.
  • for 반복문으로 배열의 모든 요소를 순회하면서, 현재 요소가 배열인지 Array.isArray()로 검사합니다.
  • 요소가 배열이라면 recursiveMultiplication 함수를 재귀 호출하여 내부 배열의 곱을 구한 뒤 누적합니다.
  • 요소가 배열이 아니라면 arr[i] || 1을 사용합니다. falsy 값(null, undefined, false, 0)은 모두 1로 대체되어 곱셈 결과에 영향을 주지 않습니다.

이처럼 재귀 호출과 논리 OR 연산자를 조합하면, 깊이에 상관없이 중첩된 배열에서도 숫자 값만 정확하게 곱할 수 있습니다.