이번 글에서는 길이가 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()가 배열을 순회하면서 현재 인덱스ind가l / 2보다 작으면 해당 값을left에 곱하고, 아니면right에 곱합니다.- 순회가 끝나면 두 곱을 더하여 반환합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
126
이처럼 reduce() 하나만으로 배열을 분할하고 곱을 계산하는 작업을 한 번의 순회로 처리할 수 있어 효율적입니다. 시간 복잡도는 O(N)이며, 추가 배열을 생성하지 않으므로 메모리 측면에서도 유리합니다.