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으로 합산되는 식입니다. 각 고유 값은 처음 등장한 순서를 유지한 채, 해당 값들이 모두 더해진 합계로 대체됩니다.

해결 접근 방법

이 문제는 Map 객체를 활용하면 간단하게 해결할 수 있습니다. reduce() 메서드로 각 숫자의 등장 횟수를 Map에 기록한 뒤, Map의 각 항목을 '값 × 등장 횟수' 형태로 변환하여 새로운 배열을 만들면 됩니다.

예제 코드

const input = [1, 3, 1, 3, 5, 7, 5, 4];
const mergeDuplicates = 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(mergeDuplicates(input));

출력 결과

위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.

[ 2, 6, 10, 7, 4 ]

코드 설명

reduce()new Map()을 사용해 각 숫자가 몇 번 등장했는지 카운트합니다. acc.has(val)로 해당 값이 이미 Map에 존재하는지 확인하고, 존재하면 기존 카운트에 1을 더하고, 없으면 1로 초기화합니다.

그다음 Array.from(map, ...)은 Map의 각 [키, 값] 쌍을 순회하며 새 배열을 생성합니다. 여기서 el[0] * el[1]은 '숫자 값 × 등장 횟수'를 의미하며, 이것이 곧 중복 값을 모두 합친 최종 결과입니다.

Map은 요소의 삽입 순서를 유지하는 자료구조이므로, 각 고유 값은 원본 배열에서 처음 나타난 순서대로 결과 배열에 배치됩니다. 따라서 시간 복잡도는 O(n)으로 매우 효율적이며, 배열 길이가 길어져도 성능 저하 없이 동작합니다.