문제 이해하기
이번 글에서는 중복된 숫자가 포함될 수 있는 숫자 배열을 입력받아, 배열에 단 한 번만 등장하는 고유한 요소들의 합을 반환하는 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) 방식을 고려하는 것이 좋습니다.