문제 상황
JavaScript 함수를 작성해야 합니다. 이 함수는 숫자 배열 arr을 첫 번째 인수로, 숫자 num(배열 길이 이하)을 두 번째 인수로 받습니다.
함수는 배열 arr에서 길이가 num인 각각의 연속된(인접한) 부분 배열의 합을 계산하고, 그 합들을 새 배열의 요소로 만들어 최종적으로 반환해야 합니다.
입력 예시
예를 들어 함수에 다음과 같은 입력이 주어졌다고 가정해 보겠습니다.
const arr = [1, 2, 3, 4, 5, 6];
const num = 2;
이 경우 기대하는 출력은 다음과 같습니다.
const output = [3, 5, 7, 9, 11];
출력 설명
출력 결과가 위와 같은 이유는 인접한 요소들을 차례대로 더했기 때문입니다.
- 1 + 2 = 3
- 2 + 3 = 5
- 3 + 4 = 7
- 4 + 5 = 9
- 5 + 6 = 11
해결 코드
다음은 슬라이딩 윈도우(Sliding Window) 기법을 활용한 코드입니다.
const arr = [1, 2, 3, 4, 5, 6];
const num = 2;
const accumulateArray = (arr = [], num = 1) => {
const res = [];
let sum = 0, right = 0, left = 0;
// 첫 번째 윈도우(구간)의 합을 미리 계산
for(; right < num; right++){
sum += arr[right];
};
res.push(sum);
// 윈도우를 한 칸씩 이동하며 합을 갱신
while(right < arr.length){
sum -= arr[left];
sum += arr[right];
right++;
left++;
res.push(sum);
};
return res;
};
console.log(accumulateArray(arr, num));
코드 동작 원리
이 코드는 매번 구간 전체를 다시 더하는 대신, 이전 구간의 합에서 왼쪽 끝 요소를 빼고 새로 들어오는 오른쪽 요소를 더하는 방식으로 합을 갱신합니다.
덕분에 시간 복잡도는 O(n)으로 유지되며, 단순히 모든 부분 배열을 반복해서 더하는 O(n × num) 방식보다 훨씬 효율적입니다.
실행 결과
콘솔 출력 결과는 다음과 같습니다.
[3, 5, 7, 9, 11]