합집합(Union)이란?
합집합은 두 집합의 모든 원소를 하나로 합쳐 만든 집합입니다. 즉, 집합 A와 B의 합집합은 A에 속하거나, B에 속하거나, 또는 양쪽 모두에 속하는 원소 전체를 의미합니다.
예를 들어 −
두 개의 배열로 표현된 집합이 다음과 같다고 가정해 보겠습니다.
const arr1 = [1, 2, 3]; const arr2 = [100, 2, 1, 10];
이때 두 집합의 합집합은 다음과 같습니다.
const union = [1, 2, 3, 10, 100];
정리하면, 우리가 작성해야 할 함수는 리터럴 값으로 이루어진 두 개의 배열을 인자로 받아, 중복을 제거하고 모든 고유 원소를 포함하는 합집합 배열을 반환하는 JavaScript 함수입니다.
구현 예제
다음은 객체(map)를 해시 테이블처럼 활용하여 합집합을 구하는 코드입니다.
const arr1 = [1, 2, 3];
const arr2 = [100, 2, 1, 10];
const findUnion = (arr1 = [], arr2 = []) => {
const map = {};
const res = [];
for (let i = arr1.length - 1; i >= 0; --i){
map[arr1[i]] = arr1[i];
};
for (let i = arr2.length - 1; i >= 0; --i){
map[arr2[i]] = arr2[i];
};
for (const n in map){
if (map.hasOwnProperty(n)){
res.push(map[n]);
}
}
return res;
};
console.log(findUnion(arr1, arr2));출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[ 1, 2, 3, 10, 100 ]
동작 원리
이 코드의 핵심은 빈 객체 map입니다. 각 배열의 원소를 순회하면서 객체의 키로 저장하는데, 객체의 키는 중복될 수 없기 때문에 자연스럽게 중복 원소가 제거됩니다. 마지막으로 hasOwnProperty()로 상속된 프로퍼티를 걸러낸 뒤, 남은 값들을 배열에 담아 반환합니다.
더 간단한 방법: ES6 Set 활용하기
ES6에서 도입된 Set 자료구조를 사용하면 위 로직을 한 줄로 대체할 수 있습니다. Set은 중복 값을 허용하지 않으므로, 두 배열을 펼쳐서 하나의 Set으로 만든 후 다시 배열로 변환하면 됩니다.
const findUnion = (arr1, arr2) => [...new Set([...arr1, ...arr2])]; console.log(findUnion([1, 2, 3], [100, 2, 1, 10])); // [ 1, 2, 3, 10, 100 ]
두 방식 모두 시간 복잡도는 O(n + m)으로 효율적이며, 실무에서는 코드가 간결한 Set 방식을 주로 사용하는 것이 좋습니다. 다만 객체 키 방식은 원소가 문자열로 강제 변환된다는 점, Set 방식은 삽입 순서가 유지된다는 점을 참고하면 상황에 맞는 선택에 도움이 됩니다.