🔥 집합 연산

637자
8분

Swift 에서는 두 개의 집합을 결합하거나, 두 집합이 공통으로 가지고 있는 값을 파악하거나, 두 집합이 동일한 값을 모두, 일부, 또는 전혀 포함하고 있는지 여부를 효율적으로 확인할 수 있습니다.

기본 집합 연산

아래 그림은 ab라는 두 개의 집합을 나타내며, 다양한 집합 연산의 결과는 음영으로 표시되어 있습니다.

lecture image

  • intersection(_:) 메서드를 사용하여 두 집합에 공통된 값만 포함하는 새로운 집합을 생성할 수 있습니다.
  • symmetricDifference(_:) 메서드를 사용하여 두 집합 중 하나에만 속하는 값을 포함하는 새로운 집합을 생성할 수 있습니다.
  • union(_:) 메서드를 사용하여 두 집합의 모든 값을 포함하는 새로운 집합을 생성할 수 있습니다.
  • subtracting(_:) 메서드를 사용하여 지정된 집합에 없는 값만 포함하는 새로운 집합을 생성할 수 있습니다.

예를 들어, 다음과 같이 세 개의 집합을 정의해 보겠습니다.

let oddDigits: Set = [1, 3, 5, 7, 9]     // 홀수 숫자 집합
let evenDigits: Set = [0, 2, 4, 6, 8]    // 짝수 숫자 집합
let singleDigitPrimeNumbers: Set = [2, 3, 5, 7]   // 한 자리 소수 집합
swift

이제 다양한 집합 연산을 수행해 볼까요?

oddDigits.union(evenDigits).sorted()
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
// 홀수 집합과 짝수 집합의 합집합을 구하고 정렬합니다.
 
oddDigits.intersection(evenDigits).sorted()
// []
// 홀수 집합과 짝수 집합의 교집합을 구하고 정렬합니다. (공통 요소 없음)
 
oddDigits.subtracting(singleDigitPrimeNumbers).sorted()
// [1, 9]
// 홀수 집합에서 한 자리 소수 집합을 뺀 차집합을 구하고 정렬합니다.
 
oddDigits.symmetricDifference(singleDigitPrimeNumbers).sorted()
// [1, 2, 9]
// 홀수 집합과 한 자리 소수 집합 중 하나에만 속하는 요소로 이루어진 대칭차집합을 구하고 정렬합니다.
swift

집합 연산을 활용하면 두 집합 사이의 관계를 쉽게 파악할 수 있습니다. 예를 들어, 홀수 집합에 짝수 집합의 모든 요소가 포함되어 있는지, 혹은 그 반대인지 확인할 수 있지요.

집합의 포함 관계와 동등 관계

아래 그림은 a, b, c 세 개의 집합을 나타내며, 겹치는 영역은 집합 간에 공유하는 요소를 나타냅니다. 집합 a는 집합 b상위집합(superset)입니다. 왜냐하면 ab의 모든 요소를 포함하고 있기 때문이죠. 반대로 집합 b는 집합 a부분집합(subset)입니다. 집합 b와 집합 c는 서로 서로소(disjoint)입니다. 왜냐하면 두 집합은 공통 요소를 전혀 공유하지 않기 때문입니다.

lecture image

  • "같음" 연산자(==)를 사용하여 두 집합이 모든 값을 동일하게 포함하고 있는지 확인할 수 있습니다.
  • isSubset(of:) 메서드를 사용하여 한 집합의 모든 값이 지정된 집합에 포함되는지 확인할 수 있습니다.
  • isSuperset(of:) 메서드를 사용하여 한 집합이 지정된 집합의 모든 값을 포함하는지 확인할 수 있습니다.
  • isStrictSubset(of:) 또는 isStrictSuperset(of:) 메서드를 사용하여 한 집합이 지정된 집합의 부분집합 또는 상위집합이지만 같지는 않은지 확인할 수 있습니다.
  • isDisjoint(with:) 메서드를 사용하여 두 집합이 공통 값을 가지고 있지 않은지 확인할 수 있습니다.

예를 들어 봅시다. 다음과 같이 세 개의 집합을 정의해 보겠습니다.

let houseAnimals: Set = ["🐶", "🐱"]      // 집에서 키우는 동물 집합
let farmAnimals: Set = ["🐮", "🐔", "🐑", "🐶", "🐱"]   // 농장 동물 집합
let cityAnimals: Set = ["🐦", "🐭"]       // 도시 동물 집합
swift

이제 집합 간의 포함 관계와 동등 관계를 확인해 볼까요?

houseAnimals.isSubset(of: farmAnimals)
// true
// 집에서 키우는 동물 집합은 농장 동물 집합의 부분집합인가요? 네, 맞습니다!
 
farmAnimals.isSuperset(of: houseAnimals)
// true
// 농장 동물 집합은 집에서 키우는 동물 집합의 상위집합인가요? 네, 맞아요!
 
farmAnimals.isDisjoint(with: cityAnimals)
// true
// 농장 동물 집합과 도시 동물 집합은 서로소 관계인가요? 네, 두 집합은 공통 요소가 없네요!
swift

이처럼 Swift 의 집합 연산과 관계 메서드를 활용하면, 집합 사이의 관계를 손쉽게 파악하고 원하는 결과를 얻을 수 있습니다. 여러분도 실제 프로그램을 개발할 때 집합의 특성을 잘 활용해 보시기 바랍니다!

                   farmAnimals
                 ┌───-──────────┐
                 │  🐮, 🐔, 🐑  │
                 │    ┌──--─┐   │
 cityAnimals     │    │🐶,🐱│   │
┌─────────────┐  │    └──--─┘   │
│             │  └────-─────────┘
│   🐦, 🐭    │        │
│             │        │   houseAnimals
└─────────────┘        │  ┌─────────────┐
                       │  │             │
                       │  │    🐶, 🐱   │
                       │  │             │
                       │  └─────────────┘


text

위 도표는 세 동물 집합 사이의 관계를 시각적으로 보여줍니다. 집에서 키우는 동물은 농장 동물의 부분집합이고, 농장 동물은 집에서 키우는 동물의 상위집합입니다. 그리고 도시 동물은 농장 동물 및 집에서 키우는 동물과는 별개의 집합으로 존재하고 있지요.

이상으로 Swift 에서 집합 연산과 관계를 다루는 방법에 대해 알아보았습니다. 집합은 중복되지 않는 요소들의 모음으로, 포함 관계와 동등 관계를 효율적으로 파악할 수 있다는 장점이 있습니다.