중복된 숫자가 포함된 배열이 주어졌을 때, 동일한 값들을 하나의 인덱스로 합쳐 합계를 계산하는 JavaScript 함수를 작성해야 합니다.
문제 이해하기
예를 들어 입력 배열이 다음과 같다면,
const input = [1, 3, 1, 3, 5, 7, 5, 4];
출력은 다음과 같아야 합니다.
const output = [2, 6, 10, 7, 4];
여기서 1은 두 번 등장하므로 2가 되고, 3 역시 두 번 등장하여 6, 5는 두 번 등장해 10이 됩니다. 반면 한 번만 등장한 7과 4는 원래 값 그대로 유지됩니다.
구현 방법
이 문제는 reduce() 메서드와 Map 객체를 활용하면 깔끔하게 해결할 수 있습니다. 먼저 각 숫자의 등장 횟수를 Map에 저장한 뒤, 값 × 등장 횟수를 곱해 새로운 배열을 만들어 반환하는 방식입니다.
코드
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));
출력 결과
콘솔에는 다음과 같이 출력됩니다.
[ 2, 9, 10, 7, 4 ]
코드 설명
sumDuplicate 함수의 동작 과정은 다음과 같습니다.
1. reduce()로 배열을 순회하며 각 값의 등장 횟수를 Map 객체에 누적합니다.
2. acc.has(val)로 해당 값이 이미 존재하는지 확인하고, 존재하면 기존 카운트에 1을 더합니다.
3. 처음 등장하는 값이라면 카운트를 1로 설정합니다.
4. 마지막으로 Array.from()을 사용해 Map의 각 [키, 값] 쌍을 "키 × 값" 형태로 변환한 배열을 반환합니다.
이 접근 방식은 배열을 한 번만 순회하므로 시간 복잡도가 O(n)이며, 대용량 데이터에서도 효율적으로 동작한다는 장점이 있습니다.