문제 소개
숫자로 이루어진 길이 N(N은 짝수)의 배열을 입력받아, 배열을 각각 N/2개의 요소를 가진 두 개의 부분 배열(왼쪽, 오른쪽)로 나눈 뒤, 각 부분 배열의 합을 구하고 그 두 값을 곱하는 JavaScript 함수를 작성해야 합니다.
예를 들어 입력 배열이 다음과 같다고 가정해 보겠습니다.
const arr = [1, 2, 3, 4]
그렇다면 기대되는 출력 결과는 다음과 같습니다.
(1+2) * (3+4) = 21
구현 코드
다음은 위 문제를 해결하는 전체 코드입니다.
const arr = [1, 2, 3, 4];
const subArrayProduct = arr => {
const { length: l } = arr;
const creds = arr.reduce((acc, val, ind) => {
let { left, right } = acc;
if(ind < l/2){
left += val;
}else{
right += val;
}
return { left, right };
}, {
left: 0,
right: 0
});
return creds.left * creds.right;
};
console.log(subArrayProduct(arr));
코드 동작 원리
이 코드는 reduce() 메서드를 활용하여 배열을 한 번만 순회하면서 누적 객체에 왼쪽(left)과 오른쪽(right) 합계를 동시에 저장합니다.
- 먼저 배열의 전체 길이를 구한 뒤, 절반 지점(l/2)을 기준으로 삼습니다.
- 현재 인덱스(ind)가 절반보다 작으면 해당 요소를 left에 더하고, 그렇지 않으면 right에 더합니다.
- 순회가 끝나면 초기값으로 설정된 { left: 0, right: 0 } 객체에 각 부분 배열의 합이 저장됩니다.
- 마지막으로 두 합을 곱하여 반환합니다.
이 방식은 배열을 실제로 분리하지 않고도 한 번의 순회(O(n))만으로 결과를 얻을 수 있어 매우 효율적입니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
21