fullfish 2025. 10. 24. 14:08

set은 “중복 없는 원소들의 모음”을 해시 기반으로 매우 빠르게 관리하는 가변(collection) 타입이야. 원소의 존재 여부 체크, 합집합·교집합 같은 집합 연산을 고속으로 처리

 

기본 성질

중복 없음: 같은 값은 하나만 보관
• 순서 없음: 인덱스로 접근 불가(삽입 순서를 믿으면 안 됨)
• 변경 가능(mutable): add, remove 등으로 수정 가능
• 원소는 해시 가능해야 함: 불변(immutable)·hashable 타입만 원소로 가능
– 가능: int, str, bool, tuple(내부도 해시 가능해야), frozenset
– 불가: list, dict, set 등 가변 타입
• 평균 시간복잡도
– membership 체크 x in s: 평균 O(1)
– 추가/삭제 add, remove: 평균 O(1)
– 합·교·차 같은 집합 연산: 원소 수에 선형적으로 비례

 

기본 사용

s = set()                   # 빈 집합
s = {1, 2, 3}               # 리터럴
s.add(4)                    # {1,2,3,4}
s.update([4,5,6])           # 여러 개 추가
s.discard(10)               # 없으면 조용히 무시
s.remove(3)                 # 없으면 KeyError
x = s.pop()                 # 아무 원소 하나 꺼내고 제거
len(s)                      # 원소 개수

 

연산자와 메서드

a = {1, 2, 3, 4}
b = {3, 4, 5, 6}

# 교집합 (intersection)
print(a & b)                    # {3, 4}
print(a.intersection(b))        # {3, 4}

# 합집합 (union)
print(a | b)                    # {1, 2, 3, 4, 5, 6}
print(a.union(b))               # {1, 2, 3, 4, 5, 6}

# 차집합 (difference)
print(a - b)                    # {1, 2}
print(a.difference(b))          # {1, 2}

# 대칭차집합 (symmetric difference)
print(a ^ b)                    # {1, 2, 5, 6}
print(a.symmetric_difference(b))# {1, 2, 5, 6}

# 부분집합 (subset)
print(a <= b)                   # False (a가 b의 부분집합이 아님)
print({1,2} <= a)               # True  ({1,2}는 a의 부분집합)
print({1,2} < a)                # True  (진부분집합)

# 상위집합 (superset)
print(a >= {1,2})               # True (a가 {1,2}의 상위집합)

# 서로소 여부 (disjoint)
print(a.isdisjoint({7,8}))      # True  (공통 원소 없음)
print(a.isdisjoint(b))          # False (3,4 겹침)

# 제자리 갱신 (in-place update)
c = {1, 2, 3}
d = {3, 4, 5}

c &= d                          # 교집합 갱신 → c는 {3}
print(c)

c = {1, 2, 3}
c |= d                          # 합집합 갱신 → c는 {1,2,3,4,5}
print(c)

c = {1, 2, 3, 4}
c -= d                          # 차집합 갱신 → c는 {1,2}
print(c)

c = {1, 2, 3}
c ^= d                          # 대칭차집합 갱신 → c는 {1,2,4,5}
print(c)

# 메서드 방식도 동일한 동작
a = {1, 2, 3, 4}
b = {3, 4, 5}

a.intersection_update(b)        # a = {3, 4}
a.update({10, 11})              # a = {3, 4, 10, 11}
a.difference_update({4, 11})    # a = {3, 10}
a.symmetric_difference_update({10, 99})  # a = {3, 99}
print(a)