숫자 배열을 입력받아 새로운 배열을 반환하는 JavaScript 함수를 작성해야 합니다. 이때 새 배열의 각 인덱스에는 원본 배열에서 해당 인덱스까지의 모든 숫자의 합이 담겨야 합니다.
문제 이해하기
예를 들어, 입력 배열이 다음과 같다면 −
const arr = [1, 2, 3, 4, 5];
출력 결과는 다음과 같아야 합니다 −
const output = [1, 3, 6, 10, 15];
각 요소가 어떻게 계산되는지 살펴보면 다음과 같습니다.
- 인덱스 0: 1
- 인덱스 1: 1 + 2 = 3
- 인덱스 2: 1 + 2 + 3 = 6
- 인덱스 3: 1 + 2 + 3 + 4 = 10
- 인덱스 4: 1 + 2 + 3 + 4 + 5 = 15
접근 방식: 동적 프로그래밍(Dynamic Programming)
이 문제는 동적 프로그래밍 기법으로 효율적으로 해결할 수 있습니다. 매번 처음부터 합을 다시 계산하는 대신, 이전 인덱스까지의 누적 합을 저장해 두고 현재 요소만 더하면 되기 때문입니다. 즉, result[i] = arr[i] + result[i-1] 공식을 반복 적용하는 것입니다.
이 방식은 시간 복잡도 O(n)으로 배열을 한 번만 순회하면 되므로 매우 효율적입니다.
코드 구현
다음은 위 접근 방식을 구현한 코드입니다 −
const arr = [1, 2, 3, 4, 5];
const cumulativeSum = arr => {
let result = [arr[0]];
for(let i = 1; i < arr.length; i++) {
result.push(arr[i] + result[i-1]);
}
return result;
}
console.log(cumulativeSum(arr));코드 설명
- 결과 배열의 첫 번째 요소는 원본 배열의 첫 번째 요소와 같으므로
[arr[0]]으로 초기화합니다. - 두 번째 요소부터 마지막 요소까지 반복하면서, 현재 요소에 바로 앞 인덱스의 누적 합(
result[i-1])을 더한 값을 결과 배열에 추가합니다. - 모든 반복이 끝나면 완성된 누적 합계 배열을 반환합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다 −
[ 1, 3, 6, 10, 15 ]
기대했던 대로 각 인덱스까지의 누적 합계가 정확히 계산된 것을 확인할 수 있습니다.