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

JavaScript로 연속된 배열 요소의 합을 누적해 새 배열 만들기


문제 상황

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]