문제 정의
숫자 배열을 인수로 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 새로운 배열을 생성해 반환해야 하는데, 새 배열의 각 요소는 원본 배열에서 해당 위치 자신을 포함한 오른쪽에 있는 모든 요소들의 합이 되어야 합니다.
예를 들어 입력 배열이 [5, 6, 1, 3, 8, 11]이라면 결과는 다음과 같습니다.
- 첫 번째 요소: 5 + 6 + 1 + 3 + 8 + 11 = 34
- 두 번째 요소: 6 + 1 + 3 + 8 + 11 = 29
- 세 번째 요소: 1 + 3 + 8 + 11 = 23
- 네 번째 요소: 3 + 8 + 11 = 22
- 다섯 번째 요소: 8 + 11 = 19
- 여섯 번째 요소: 11 = 11
- 마지막 요소: 남은 요소가 없으므로 0
구현 코드
다음은 이 문제를 해결하는 코드입니다.
const arr = [5, 6, 1, 3, 8, 11];
const partialSum = (arr = []) => {
let sum = arr.reduce((acc, val) => acc + val);
const res = [];
let x = 0;
if(arr.length === 0){
return [0];
}
for(let i = 0; i <= arr.length; i += 1) {
res.push(sum);
x = arr[i];
sum -= x;
};
return res;
};
console.log(partialSum(arr));
출력 결과
[ 34, 29, 23, 22, 19, 11, 0 ]
코드 동작 방식
reduce()메서드를 사용해 배열 전체의 총합을 먼저 계산합니다.for반복문을 실행하면서 현재 합계를 결과 배열에 추가(push)합니다.- 그다음 현재 위치의 요소 값을 합계에서 빼면, 다음 위치부터의 부분 합계가 자연스럽게 구해집니다.
- 반복문이 배열 길이만큼 한 번 더 실행되므로, 마지막에는 모든 요소가 차감된 값 0이 함께 반환됩니다.
- 또한 빈 배열이 들어오면
[0]을 반환하도록 예외 처리도 포함되어 있습니다.
이처럼 총합을 미리 계산해 둔 뒤 요소를 하나씩 빼는 방식을 사용하면, 매번 slice()와 reduce()를 호출하는 것보다 훨씬 효율적으로 부분 합계 배열을 만들 수 있습니다.