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

JavaScript로 배열의 부분 합계(Partial Sum) 구현하기


문제 정의

숫자 배열을 인수로 받는 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 ]

코드 동작 방식

  1. reduce() 메서드를 사용해 배열 전체의 총합을 먼저 계산합니다.
  2. for 반복문을 실행하면서 현재 합계를 결과 배열에 추가(push)합니다.
  3. 그다음 현재 위치의 요소 값을 합계에서 빼면, 다음 위치부터의 부분 합계가 자연스럽게 구해집니다.
  4. 반복문이 배열 길이만큼 한 번 더 실행되므로, 마지막에는 모든 요소가 차감된 값 0이 함께 반환됩니다.
  5. 또한 빈 배열이 들어오면 [0]을 반환하도록 예외 처리도 포함되어 있습니다.

이처럼 총합을 미리 계산해 둔 뒤 요소를 하나씩 빼는 방식을 사용하면, 매번 slice()reduce()를 호출하는 것보다 훨씬 효율적으로 부분 합계 배열을 만들 수 있습니다.