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

JavaScript로 두 배열의 합집합(Union) 구하기 — 기본 원리부터 Set 활용법까지

합집합(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 방식은 삽입 순서가 유지된다는 점을 참고하면 상황에 맞는 선택에 도움이 됩니다.