중첩된 배열 안에 숫자뿐만 아니라 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 연산자를 조합하면, 깊이에 상관없이 중첩된 배열에서도 숫자 값만 정확하게 곱할 수 있습니다.