본문으로 바로가기

[JavaScript] JavaScript에서 Array, Set으로 집합 연산하기

JavaScript에서 집합을 다룰 때 배열을 많이 사용했습니다.
해당 게시글에서는 아래 집합 연산을 구현해볼 것입니다.

Chat GPT에게 먼저 집합 연산을 물어보니 아래처럼 답변을 해주었습니다.

합집합 (Union): A, B 함수는 두 집합의 합집합을 반환합니다.
교집합 (Intersection): A, B 함수는 두 집합의 교집합을 반환합니다.
차집합 (Difference): A, B 함수는 첫 번째 집합에서 두 번째 집합을 뺀 차집합을 반환합니다.
대칭 차집합 (Symmetric Difference): A, B 함수는 두 집합의 대칭 차집합을 반환합니다.
부분집합 (Subset): A, B 함수는 첫 번째 집합이 두 번째 집합의 부분집합인지 확인합니다.
상위집합 (Superset): A, B 함수는 첫 번째 집합이 두 번째 집합의 상위집합인지 확인합니다.
서로소 (Disjoint): A, B 함수는 두 집합이 서로소인지 확인합니다.

위에 적혀있는 연산을 배열로 구현해보고 Set을 사용하면 얼마나 간단하게 구현할 수 있는 지 알아보겠습니다.

배열로 구현하기

간단하게 차집합, 교집합, 대칭 차집합을 구현해보겠습니다.
배열로 구현을 하여도 위처럼 쉽게 구현이 가능합니다.

// 차집합 (Difference)
const getDifference = (arr1, arr2) => {
  return arr1.filter(item => !arr2.includes(item));
};

// 교집합 (Intersection)
const getIntersection = (arr1, arr2) => {
  return arr1.filter(item => arr2.includes(item));
};

// 대칭 차집합 (Symmetric Difference)
const getExclusiveOr = (arr1, arr2) => {
  return arr1
    .filter(item => !arr2.includes(item))
    .concat(arr2.filter(el => !arr1.includes(el)));
};

Set으로 구현하기 - 1

Chat GPT에게 구현을 부탁하니 Set으로 구현을 해주었습니다.

// 합집합 (Union)
function union(setA, setB) {
    return new Set([...setA, ...setB]);
}

// 교집합 (Intersection)
function intersection(setA, setB) {
    return new Set([...setA].filter(x => setB.has(x)));
}

// 차집합 (Difference)
function difference(setA, setB) {
    return new Set([...setA].filter(x => !setB.has(x)));
}

// 대칭 차집합 (Symmetric Difference)
function symmetricDifference(setA, setB) {
    let diffA = new Set([...setA].filter(x => !setB.has(x)));
    let diffB = new Set([...setB].filter(x => !setA.has(x)));
    return new Set([...diffA, ...diffB]);
}

// 부분집합 (Subset)
function isSubset(setA, setB) {
    return [...setA].every(x => setB.has(x));
}

// 상위집합 (Superset)
function isSuperset(setA, setB) {
    return [...setB].every(x => setA.has(x));
}

// 서로소 (Disjoint)
function isDisjoint(setA, setB) {
    return [...setA].every(x => !setB.has(x));
}

// 예제 사용법
let setA = new Set([1, 2, 3]);
let setB = new Set([3, 4, 5]);

console.log("Union:", union(setA, setB));
console.log("Intersection:", intersection(setA, setB));
console.log("Symmetric Difference:", symmetricDifference(setA, setB));
console.log("Difference (A - B):", difference(setA, setB));
console.log("Difference (B - A):", difference(setB, setA));
console.log("Is Subset (A ⊆ B):", isSubset(setA, setB));
console.log("Is Superset (A ⊇ B):", isSuperset(setA, setB));
console.log("Is Disjoint:", isDisjoint(setA, setB));

Set으로 구현하기 - 2

그러나 Chat GPT가 가르쳐준 내용이 최선일까요?
나쁘지는 않지만 Chat GPT보다 더 빠르고 간단하게 사용할 수 있는 방법이 있습니다.
사실 위 모든 내용은 Set의 내장함수로 존재합니다.

let setA = new Set([1, 2, 3]);
let setB = new Set([3, 4, 5]);

console.log("Union:", setA.union(setB));
console.log("Intersection:", setA.intersection(setB));
console.log("Symmetric Difference:", setA.symmetricDifference(setB));
console.log("Difference (A - B):", setA.difference(setB));
console.log("Difference (B - A):", setB.difference(setA));
console.log("Is Subset (A ⊆ B):", setA.isSubsetOf(setB));
console.log("Is Superset (A ⊇ B):", setA.isSupersetOf(setB));
console.log("Is Disjoint:", setA.isDisjointFrom(setB));

함수를 구현할 필요조차 없이 내장함수로 처리할 수 있습니다.

참고문헌

• New JavaScript Set methods

반응형