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

JavaScript에서 배열의 중복 값을 하나로 합산하는 방법 (Map·reduce 활용)

JavaScript 프로그래밍에서는 중복된 요소가 포함된 숫자 배열을 다루다 보면, 같은 값을 가진 요소들을 하나로 합산해야 하는 경우가 자주 발생합니다. 예를 들어 [1, 3, 1] 배열에서 1이 두 번 등장한다면, 이를 2라는 단일 값으로 합치는 것이 목표입니다.

접근 방식

이 문제를 효율적으로 해결하려면 Map 객체reduce() 메서드를 조합하는 것이 좋습니다. 먼저 각 값이 몇 번 등장했는지 빈도수를 계산한 뒤, 고유한 값에 등장 횟수를 곱하면 해당 값들의 합계를 구할 수 있습니다.

구현 코드

const input = [1, 3, 1, 3, 5, 7, 5, 3, 4];
const sumDuplicate = arr => {
   const map = arr.reduce((acc, val) => {
      if(acc.has(val)){
         acc.set(val, acc.get(val) + 1);
      }else{
         acc.set(val, 1);
      };
      return acc;
   }, new Map());
   return Array.from(map, el => el[0] * el[1]);
};
console.log(sumDuplicate(input));

코드 동작 원리

  1. reduce()로 빈도수 계산: 배열을 순회하며 Map 객체에 각 값의 등장 횟수를 저장합니다. 이미 존재하는 값이면 기존 카운트에 1을 더하고, 처음 등장한 값이면 1로 초기화합니다.
  2. Array.from()으로 변환: Map의 각 항목(키-값 쌍)에 대해 키(고유 값)와 값(등장 횟수)을 곱합니다.
  3. 결과 반환: 곱셈 결과로 이루어진 새로운 배열을 반환합니다.

실행 결과

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

[ 2, 9, 10, 7, 4 ]

입력 배열 [1, 3, 1, 3, 5, 7, 5, 3, 4]에서 각 값의 등장 횟수를 살펴보면 결과를 쉽게 이해할 수 있습니다.

  • 1: 2번 등장 → 1 × 2 = 2
  • 3: 3번 등장 → 3 × 3 = 9
  • 5: 2번 등장 → 5 × 2 = 10
  • 7: 1번 등장 → 7 × 1 = 7
  • 4: 1번 등장 → 4 × 1 = 4

대안: Object 객체 활용하기

Map 대신 일반 객체(Object)를 사용해도 동일한 결과를 얻을 수 있습니다.

const sumDuplicate = arr => {
   const counts = {};
   arr.forEach(val => {
      counts[val] = (counts[val] || 0) + 1;
   });
   return Object.entries(counts).map(([key, count]) => key * count);
};
console.log(sumDuplicate(input)); // [ 2, 9, 10, 7, 4 ]

이처럼 reduce()와 Map을 조합하면 시간 복잡도 O(n)으로 배열 내 중복 값을 손쉽게 합산할 수 있으며, 코드도 간결하고 가독성이 뛰어납니다. 데이터 집계나 통계 처리 작업에서 유용하게 활용할 수 있는 패턴이니 꼭 익혀두시길 권장합니다.