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

JavaScript에서 숫자 배열을 누적 합계 배열로 변환하는 방법

문제 상황

JavaScript로 개발을 하다 보면 다음과 같은 숫자 배열을 다뤄야 할 때가 있습니다.

const arr = [1, 1, 5, 2, -4, 6, 10];

이 배열을 누적 합계(partial sum) 배열로 변환하는 것이 목표입니다. 즉, 각 요소가 처음부터 해당 위치까지의 모든 요소를 더한 값이 되도록, 원본과 같은 크기의 새로운 배열을 반환하는 함수를 작성해야 합니다.

따라서 기대되는 출력 결과는 다음과 같습니다.

const output = [1, 2, 7, 9, 5, 11, 21];

partialSum() 함수 구현

그럼 누적 합계를 계산하는 partialSum() 함수를 작성해 보겠습니다. 전체 코드는 다음과 같습니다.

const arr = [1, 1, 5, 2, -4, 6, 10];
const partialSum = (arr) => {
    const output = [];
    arr.forEach((num, index) => {
        if(index === 0){
            output[index] = num;
        }else{
            output[index] = num + output[index - 1];
        }
    });
    return output;
};
console.log(partialSum(arr));

위 코드에서는 forEach() 메서드로 배열을 순회하면서, output 배열의 각 위치에 현재 숫자와 바로 앞 요소의 합을 계속 할당했습니다. 첫 번째 요소는 이전 값이 없으므로 그대로 저장됩니다.

콘솔에서 실행한 결과는 다음과 같습니다.

[
    1, 2, 7, 9,
    5, 11, 21
]

reduce()를 활용한 대안

forEach() 대신 reduce() 메서드를 사용하면 코드를 더 간결하게 작성할 수 있습니다.

const partialSum = (arr) =>
    arr.reduce((acc, num, index) => {
        acc.push(index === 0 ? num : num + acc[index - 1]);
        return acc;
    }, []);

두 방식 모두 시간 복잡도는 O(n)으로 동일하며, 배열을 한 번만 순회하기 때문에 성능 면에서도 효율적입니다. 상황에 맞는 방식을 선택해 사용하시면 됩니다.