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

JavaScript로 연속된 숫자 합산하기: reduce() 메서드 활용법

배열을 입력받아 연속으로 반복되는 같은 숫자들을 하나로 합산한 새로운 배열을 반환하는 함수를 작성해야 한다고 가정해 보겠습니다.

예를 들어 다음과 같은 배열이 있다고 합시다.

const array = [1, 5, 5, 5, 8, 8, 9, 1, 4, 4, 2];

이때 기대하는 출력 결과는 다음과 같습니다.

[1, 15, 16, 9, 1, 8, 2]

연속된 세 개의 5는 15로 합쳐지고, 연속된 두 개의 8은 16으로, 마찬가지로 연속된 두 개의 4는 8로 합산됩니다. 중간에 다른 숫자가 끼어 있으면(예: 9와 1) 각각 그대로 유지됩니다.

해결 방법: Array.prototype.reduce() 활용

이 문제는 Array.prototype.reduce() 메서드를 사용하면 깔끔하게 해결할 수 있습니다. 원본 배열을 순회하면서 동시에 새로운 배열을 만들어 나가는 방식입니다.

핵심 아이디어는 누적 객체(acc) 안에 결과 배열(arr)과 직전에 확인한 값(last)을 함께 관리하는 것입니다. 현재 값이 직전 값과 같다면 결과 배열의 마지막 요소에 더하고, 다르다면 새 요소로 추가합니다.

예제 코드

const array = [1, 5, 5, 5, 8, 8, 9, 1, 4, 4, 2];

const sumConsecutive = (array) => {
  return array.reduce((acc, val) => {
    if (acc.last === val) {
      // 이전 값과 같으면 마지막 요소에 합산
      acc.arr[acc.arr.length - 1] += val;
    } else {
      // 다르면 새 요소로 추가
      acc.arr.push(val);
      acc.last = val;
    }
    return acc;
  }, { arr: [], last: undefined }).arr;
};

console.log(sumConsecutive(array));

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

[
  1, 15, 16, 9,
  1, 8, 2
]

코드 설명

  • 초기값: { arr: [], last: undefined } — 빈 결과 배열과 초기 비교용 값을 설정합니다.
  • 같은 값일 때: acc.arr[acc.arr.length - 1] += val; 로직으로 결과 배열의 마지막 요소에 현재 값을 더합니다.
  • 다른 값일 때: 현재 값을 새 요소로 추가하고, acc.last를 갱신하여 다음 비교에 사용합니다.

이 방식은 배열을 한 번만 순회하므로 시간 복잡도가 O(n)으로 효율적이며, 연속된 중복 데이터를 압축해야 하는 다양한 상황에서 응용할 수 있습니다.