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

배열의 모든 중복 값 합계 구하기 - JavaScript

중복된 숫자가 포함된 배열이 주어졌을 때, 동일한 값들을 하나의 인덱스로 합쳐 합계를 계산하는 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)이며, 대용량 데이터에서도 효율적으로 동작한다는 장점이 있습니다.