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

JavaScript로 배열에서 한 번만 등장하는 고유 값의 합 구하기

문제 이해하기

이번 글에서는 중복된 숫자가 포함될 수 있는 숫자 배열을 입력받아, 배열에 단 한 번만 등장하는 고유한 요소들의 합을 반환하는 JavaScript 함수를 작성해 보겠습니다. 두 번 이상 나타나는 값은 합산에서 제외됩니다.

예시

입력 배열이 다음과 같다고 가정해 보겠습니다.

const arr = [2, 5, 5, 3, 2, 7, 4, 9, 9, 11];

이 배열에서 한 번만 등장하는 요소는 3, 7, 4, 11입니다. 따라서 기대하는 출력값은 다음과 같습니다.

3 + 7 + 4 + 11 = 25

해결 접근 방식

가장 직관적인 방법은 for 루프를 사용해 배열을 순회하면서, 각 요소가 배열 내에서 유일한지 확인하는 것입니다. 자바스크립트의 indexOf()lastIndexOf() 메서드를 활용하면 손쉽게 판별할 수 있습니다.

indexOf()는 해당 요소가 처음 등장하는 인덱스를, lastIndexOf()마지막으로 등장하는 인덱스를 반환합니다. 두 값이 같다면 그 요소는 배열에 한 번만 존재한다는 의미입니다.

코드 구현

const arr = [2, 5, 5, 3, 2, 7, 4, 9, 9, 11];
const sumUnique = arr => {
    let res = 0;
    for(let i = 0; i < arr.length; i++){
        if(arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i])){
            continue;
        };
        res += arr[i];
    };
    return res;
};
console.log(sumUnique(arr));

출력 결과

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

25

코드 설명

함수 sumUnique는 배열의 각 요소를 순회하면서 indexOf()lastIndexOf()의 결과를 비교합니다. 두 인덱스가 다르면 해당 요소는 중복된 값이므로 continue를 통해 건너뛰고, 같은 경우에만 결과 변수 res에 더해 줍니다. 모든 순회가 끝나면 고유한 요소들의 합인 25가 반환됩니다.

참고로, 이 방식은 간결하지만 각 요소마다 배열을 두 번씩 탐색하므로 시간 복잡도는 O(n²)입니다. 배열의 크기가 매우 큰 경우에는 Map 객체를 활용해 각 값의 등장 횟수를 한 번의 순회로 계산한 뒤 합산하는 O(n) 방식을 고려하는 것이 좋습니다.