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));코드 동작 원리
- reduce()로 빈도수 계산: 배열을 순회하며 Map 객체에 각 값의 등장 횟수를 저장합니다. 이미 존재하는 값이면 기존 카운트에 1을 더하고, 처음 등장한 값이면 1로 초기화합니다.
- Array.from()으로 변환: Map의 각 항목(키-값 쌍)에 대해 키(고유 값)와 값(등장 횟수)을 곱합니다.
- 결과 반환: 곱셈 결과로 이루어진 새로운 배열을 반환합니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ 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)으로 배열 내 중복 값을 손쉽게 합산할 수 있으며, 코드도 간결하고 가독성이 뛰어납니다. 데이터 집계나 통계 처리 작업에서 유용하게 활용할 수 있는 패턴이니 꼭 익혀두시길 권장합니다.