문제
배열을 인자로 받는 JavaScript 함수를 작성해야 합니다. 이 함수는 입력 배열의 각 위치까지의 이동 평균(누적 평균)을 담은 새로운 배열을 생성하여 반환해야 합니다.
예를 들어 다음과 같습니다.
[1, 2, 3, 4, 5] → [1, 1.5, 2, 2.5, 3]
첫 번째 값은 첫 번째 요소의 평균, 두 번째 값은 처음 두 개 요소의 평균, 세 번째 값은 처음 세 개 요소의 평균이 되는 식으로 진행됩니다. 즉, n번째 결과값은 앞에서부터 n개 요소의 산술 평균입니다.
예제 코드
다음은 위 문제를 해결하는 전체 코드입니다.
const arr = [1, 2, 3, 4, 5];
const movingAverage = (arr = []) => {
const res = [];
let sum = 0;
let count = 0;
for(let i = 0; i < arr.length; i++){
const el = arr[i];
sum += el;
count++;
const curr = sum / count;
res[i] = curr;
};
return res;
};
console.log(movingAverage(arr));
코드 설명
이 알고리즘의 핵심은 매 단계마다 배열을 처음부터 다시 순회하며 합을 구하는 대신, 지금까지의 누적합(sum)과 처리한 요소의 개수(count)를 유지하는 것입니다. 새 요소가 들어올 때마다 누적합에 더하고 개수를 1 증가시킨 뒤, 누적합을 개수로 나누면 해당 시점까지의 평균을 O(1)에 구할 수 있습니다.
덕분에 전체 시간 복잡도는 O(n)으로, 배열을 반복적으로 다시 계산하는 비효율적인 방식(O(n²))보다 훨씬 빠르게 동작합니다.
출력 결과
위 코드를 실행했을 때 콘솔 출력은 다음과 같습니다.
[ 1, 1.5, 2, 2.5, 3 ]
각 값은 1/1=1, (1+2)/2=1.5, (1+2+3)/3=2, (1+2+3+4)/4=2.5, (1+2+3+4+5)/5=3으로 정확히 누적 평균을 나타냅니다.