문제 소개
다음과 같은 숫자 배열이 있다고 가정해 보겠습니다.
const arr = [1, 2, 3, 4, 5, 6];
여기서 우리가 작성해야 할 것은 이러한 배열을 입력받아, 원본 배열의 각 위치까지의 모든 요소를 합한 값들을 순서대로 담은 새로운 배열을 반환하는 JavaScript 함수입니다.
따라서 위 배열에 대한 실행 결과는 다음과 같아야 합니다.
const output = [1, 3, 6, 10, 15, 21];
reduce()를 활용한 해결 방법
배열의 내장 메서드인 reduce()를 사용하면 누적 합계를 깔끔하게 계산할 수 있습니다. 아래 예제 코드를 살펴보겠습니다.
const arr = [1, 2, 3, 4, 5, 6];
const findCumulativeSum = arr => {
const creds = arr.reduce((acc, val) => {
let { sum, res } = acc;
sum += val;
res.push(sum);
return { sum, res };
}, {
sum: 0,
res: []
});
return creds.res;
};
console.log(findCumulativeSum(arr));
코드 동작 원리
이 코드의 핵심은 reduce()의 초기값으로 객체 { sum: 0, res: [] }를 전달한다는 점입니다. 배열을 순회할 때마다 다음 과정이 반복됩니다.
1. 현재까지의 누적합(sum)에 현재 요소(val)를 더합니다.
2. 갱신된 누적합을 결과 배열(res)에 추가합니다.
3. 갱신된 sum과 res를 다음 순회로 전달합니다.
모든 순회가 끝나면 creds.res, 즉 누적 합계들이 담긴 배열을 반환합니다.
더 간단한 대안: map() 활용
외부 변수 하나를 활용하면 map()으로도 동일한 결과를 얻을 수 있습니다.
const findCumulativeSum = arr => {
let sum = 0;
return arr.map(num => (sum += num));
};이 방식은 코드가 훨씬 짧아 가독성이 좋지만, 외부 변수를 사용한다는 점에서 순수 함수(pure function) 관점에서는 reduce() 방식이 더 안전하다고 볼 수 있습니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ 1, 3, 6, 10, 15, 21 ]