문제 정의
임의의 깊이까지 중첩될 수 있는 배열 arr를 유일한 인수로 받아, 해당 배열의 가중치 합계(weighted sum)를 계산해 반환하는 JavaScript 함수를 작성해야 합니다.
여기서 가중치란 각 요소가 위치한 중첩 깊이(레벨)를 의미합니다. 즉, 각 숫자 요소에 자신이 속한 중첩 레벨을 곱한 뒤, 배열 전체의 값을 모두 더하면 됩니다.
입력 예시
const arr = [4, 7, [6, 1, [5, 2]]];
기대 출력
const output = 46;
출력 설명
합계는 다음과 같은 방식으로 계산됩니다.
(4 × 1) + (7 × 1) + (6 × 2) + (1 × 2) + (5 × 3) + (2 × 3) = 46
최상위 레벨(레벨 1)에 있는 4와 7은 1을 곱하고, 한 단계 안쪽(레벨 2)에 있는 6과 1은 2를 곱하며, 가장 깊은 레벨(레벨 3)에 있는 5와 2는 3을 곱한 후 모두 더한 값입니다.
구현 코드
재귀 호출을 활용하면 깊이에 상관없이 손쉽게 해결할 수 있습니다.
const arr = [4, 7, [6, 1, [5, 2]]];
const findWeightedSum = (arr = [], level = 1) => {
let res = 0;
for (let i = 0; i < arr.length; i++) {
if (typeof arr[i] === 'number') {
// 숫자 요소라면 현재 레벨을 곱해 누적
res += level * arr[i];
} else if (Array.isArray(arr[i])) {
// 배열이라면 레벨을 1 증가시켜 재귀 호출 후 결과 합산
res += findWeightedSum(arr[i], level + 1);
}
}
return res;
};
console.log(findWeightedSum(arr));
동작 원리
- 배열의 각 요소를 순회하며, 요소가 숫자이면 현재 레벨을 곱해 결과값에 더합니다.
- 요소가 배열이면 레벨을 1 증가시킨 상태로 재귀 호출하여 내부 배열의 가중치 합계를 구하고, 그 결과를 누적합니다.
- 모든 요소의 처리가 끝나면 누적된 합계를 반환합니다.
재귀 호출의 결과를 반드시 현재 누적 값에 더하는 방식으로 처리해야, 중첩 배열 뒤에 위치한 요소들도 올바르게 계산에 포함될 수 있습니다.
실행 결과
콘솔에는 다음과 같이 출력됩니다.
46