JavaScript에서 두 배열의 교집합(intersection)을 구하는 가장 쉽고 효율적인 방법은 Set 객체와 filter() 메서드를 조합하는 것입니다. Set은 중복을 허용하지 않는 자료구조이며, has() 메서드로 특정 값의 존재 여부를 빠르게 확인할 수 있어 교집합 연산에 매우 적합합니다.
배열 교집합 예제 코드
아래 코드를 실행하면 두 배열에 공통으로 포함된 요소만 추출할 수 있습니다.
<html>
<body>
<script>
let intersection = function(x, y) {
x = new Set(x), y = new Set(y);
return [...x].filter(k => y.has(k));
};
document.write(intersection([5,7,4,8], [3,9,8,4,3]));
</script>
</body>
</html>
실행 결과
4,8
첫 번째 배열 [5,7,4,8]과 두 번째 배열 [3,9,8,4,3]에 공통으로 존재하는 값은 4와 8이므로 위와 같은 결과가 출력됩니다.
코드 동작 원리
new Set(x), new Set(y): 두 배열을 각각Set객체로 변환하여 중복 요소를 제거하고, 이후 조회 성능을 높입니다.[...x]: 스프레드 연산자(spread operator)를 사용해 첫 번째Set을 다시 배열로 펼칩니다.filter(k => y.has(k)): 배열의 각 요소가 두 번째Set에 존재하는지 검사하여, 존재하는 요소만 새로운 배열로 반환합니다.
이 방식의 장점
Set의has()메서드는 평균 O(1)의 시간 복잡도를 가지므로, 배열의includes()(O(n))를 사용하는 방법보다 대량의 데이터에서 훨씬 빠릅니다.- 중복된 값을 자동으로 제거해주기 때문에 결과 배열에 같은 값이 반복해서 나타나지 않습니다.
- 코드가 짧고 직관적이라 유지보수하기 좋습니다.
이처럼 Set과 filter()를 활용하면 단 몇 줄의 코드로 JavaScript에서 배열 교집합을 손쉽게 구현할 수 있습니다.