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

JavaScript로 배열을 두 부분으로 나누어 각 곱의 합 구하기

이번 글에서는 길이가 N(양수인 짝수)인 숫자 배열을 입력받아, 이를 각각 N/2개의 요소를 가진 두 개의 하위 배열(왼쪽과 오른쪽)로 나눈 뒤, 각 하위 배열의 곱을 계산하고 그 결과를 더하는 JavaScript 함수를 작성해 보겠습니다.

문제 예시

예를 들어 입력 배열이 다음과 같다고 가정해 봅시다.

const arr = [1, 2, 3, 4, 5, 6]

배열을 앞부분 [1, 2, 3]과 뒷부분 [4, 5, 6]으로 나누면, 각 부분의 곱은 다음과 같습니다.

(1*2*3) + (4*5*6)
= 6 + 120
= 126

따라서 최종 출력값은 126이 되어야 합니다.

구현 방법

이 문제는 배열의 reduce() 메서드를 활용하면 깔끔하게 해결할 수 있습니다. 반복 과정에서 현재 인덱스가 배열 길이의 절반보다 작으면 왼쪽 곱에 값을 누적하고, 그렇지 않으면 오른쪽 곱에 누적하는 방식입니다.

const arr = [1, 2, 3, 4, 5, 6];

const subArrayProduct = arr => {
   const { length: l } = arr;
   
   // reduce로 왼쪽/오른쪽 곱을 동시에 계산
   const creds = arr.reduce((acc, val, ind) => {
      let { left, right } = acc;
      if (ind < l / 2) {
         left *= val;
      } else {
         right *= val;
      }
      return { left, right };
   }, {
      left: 1,
      right: 1
   });
   
   return creds.left + creds.right;
};

console.log(subArrayProduct(arr));

코드 설명

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

  • 먼저 배열의 전체 길이 l을 구합니다.
  • 초기 누적값으로 { left: 1, right: 1 }을 설정합니다. 곱셈의 항등원이 1이기 때문입니다.
  • reduce()가 배열을 순회하면서 현재 인덱스 indl / 2보다 작으면 해당 값을 left에 곱하고, 아니면 right에 곱합니다.
  • 순회가 끝나면 두 곱을 더하여 반환합니다.

실행 결과

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

126

이처럼 reduce() 하나만으로 배열을 분할하고 곱을 계산하는 작업을 한 번의 순회로 처리할 수 있어 효율적입니다. 시간 복잡도는 O(N)이며, 추가 배열을 생성하지 않으므로 메모리 측면에서도 유리합니다.