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

JavaScript로 중첩 배열의 가중치 합계 계산하기

문제 정의

임의의 깊이까지 중첩될 수 있는 배열 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)에 있는 47은 1을 곱하고, 한 단계 안쪽(레벨 2)에 있는 61은 2를 곱하며, 가장 깊은 레벨(레벨 3)에 있는 52는 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