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

JavaScript로 배열 요소의 누적 합계 구하기

문제 소개

다음과 같은 숫자 배열이 있다고 가정해 보겠습니다.

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. 갱신된 sumres를 다음 순회로 전달합니다.

모든 순회가 끝나면 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 ]