python에서 2개의 set에 대해서 합집합, 교집합, 차집합, 대칭 차집합 등을 구하고 싶을 때가 있습니다. 어떻게 구하면 될까요?

 

 먼저 set A에 속하지만, set B에 속하지 않는 원소들을 모두 구해봅시다. 그러려면 A에서 B를 빼면 됩니다. 3번째 줄에 C = (A - B)라고 했는데요. 이는 A와 B의 차집합을 구하라는 의미입니다. 이는 A에서 A와 B의 교집합을 빼는 것과 같습니다. A와 B의 교집합에 속하는 원소는 2이므로, A에서 원소 2가 빠지면 {1, 4}가 됩니다.

 

 

 결과는 예상한 대로 나왔음을 알 수 있습니다.

 

 

 교집합을 구해 봅시다. (A & B)는 set A와 set B의 교집합을 구합니다. A와 B 집합에 동시에 속하는 원소는 2입니다.

 

 

 따라서 2만 출력됩니다.

 


 A 또는 B에 속하는 원소를 구하고 싶을 때도 있습니다. 이 때에는 | 연산자를 이용하면 됩니다.

 

 예를 들어 이 프로그램을 봅시다. A 집합에 1, 2, 4가 있고, B 집합에 2, 3, 7, 15가 있습니다. 이 두 집합 중 하나 이상에 속하는 원소는 {1, 2, 3, 4, 7, 15} 입니다. 결과가 그렇게 나올까요?

 

 

 정말 그렇게 나옴을 알 수 있어요.

 

 

 set A와 set B의 대칭차집합을 구하기 위해서는 ^ 연산자를 이용하면 됩니다. A와 B 중 하나에만 속하는 원소를 구하는 것이라고 생각하시면 됩니다. A와 B 둘 중 최소 하나 이상에 속하는 것은 1, 2, 3, 4, 7, 15인데요. 이 중 2는 A와 B 둘 다 속하니 2는 제외됩니다.

 

 따라서 {1, 3, 4, 7, 15}가 결과로 나옵니다.

 


 이제 실전 문제를 풀어봅시다. 제가 출제한 문제인데요. 오늘 배운 내용을 토대로 간단하게 줄여 봅시다. 먼저 이 문제는 메모장에 키워드가 있었는데, 가희가 글을 쓸 때 마다 관련된 키워드가 메모장에서 지워지는 거에요. 예를 들어 기존에 {A, B, C, D, E}라는 것이 있었는데, B와 C에 대한 것을 썼다면, B, C가 제거되는 것입니다.

 

 어라라? 잠깐. A에 속하는 데 B에 속하지 않는다? 차집합을 고려해 볼 만 합니다. 그런데 업데이트까지 되어야 하네요? 그러면 기존에 메모장에 있었던 set을 key라 하고, 제거할 key들의 집합을 s라 했을 때 key는 key에서 s를 빼면 됨을 알 수 있어요. update 연산을 쓰면 되는데요. key -= s는, key에 속하면서 s에 속한 원소들을 key에서 제거합니다.

 

 

 2번째 for loop가 핵심입니다. key는 메모장에 있는 키워드를, s는 제가 블로그에 쓴 키워드를 의미합니다. 쿼리가 수행될 때 마다, 블로그에 쓴 키워드가 제거되어야 하므로 차집합 연산을 수행해야 합니다. update가 되어야 하니, different_update 연산을 사용하였습니다.

 

 

 예제 1번 입력에 대해 잘 동작함을 알 수 있습니다. 해당 코드는 여기에서 보실 수 있습니다.