🎯 1. μ…‹ κΈ°λ³Έ κ°œλ… ⭐⭐⭐

μ…‹μ˜ νŠΉμ§•

# 1. 쀑볡 μ—†μŒ (μžλ™μœΌλ‘œ 쀑볡 제거)
s = {1, 2, 2, 3, 3, 3}
print(s)  # {1, 2, 3}

# 2. μˆœμ„œ μ—†μŒ (인덱슀 μ ‘κ·Ό λΆˆκ°€)
s = {3, 1, 2}
# s[0]  # TypeError! 인덱슀 μ ‘κ·Ό λΆˆκ°€

# 3. λ³€κ²½ κ°€λŠ₯ (mutable) - μš”μ†Œ μΆ”κ°€/μ‚­μ œ κ°€λŠ₯
s.add(4)
s.remove(1)

# 4. ν•΄μ‹œ κ°€λŠ₯ν•œ 객체만 μ €μž₯ κ°€λŠ₯
s = {1, 'hello', (1, 2)}  # βœ… OK
# s = {[1, 2]}  # ❌ TypeError! λ¦¬μŠ€νŠΈλŠ” λΆˆκ°€

# 5. λΉ λ₯Έ 검색 O(1)
print(3 in s)  # True, 맀우 빠름!

μ…‹ 생성

# 방법 1: μ€‘κ΄„ν˜Έ
s = {1, 2, 3, 4, 5}

# 방법 2: set() ν•¨μˆ˜
s = set([1, 2, 3, 4, 5])
s = set('hello')  # {'h', 'e', 'l', 'o'}

# 빈 μ…‹ (주의!)
s = set()  # βœ… 빈 μ…‹
# s = {}   # ❌ 이건 빈 λ”•μ…”λ„ˆλ¦¬!

# 리슀트 β†’ μ…‹ (쀑볡 제거)
arr = [1, 2, 2, 3, 3, 3, 4]
s = set(arr)  # {1, 2, 3, 4}

# μ…‹ μ»΄ν”„λ¦¬ν—¨μ…˜
s = {x**2 for x in range(1, 6)}
# {1, 4, 9, 16, 25}

μ…‹ κΈ°λ³Έ λ©”μ„œλ“œ

s = {1, 2, 3}

# μΆ”κ°€
s.add(4)          # {1, 2, 3, 4}
s.add(2)          # {1, 2, 3, 4} (쀑볡 λ¬΄μ‹œ)

# μ—¬λŸ¬ 개 μΆ”κ°€
s.update([5, 6, 7])  # {1, 2, 3, 4, 5, 6, 7}

# 제거
s.remove(3)       # {1, 2, 4, 5, 6, 7}
# s.remove(10)    # KeyError!

s.discard(10)     # μ—λŸ¬ μ•ˆ 남 (없어도 OK)

# μž„μ˜ 제거
val = s.pop()     # μž„μ˜μ˜ κ°’ μ œκ±°ν•˜κ³  λ°˜ν™˜

# 전체 μ‚­μ œ
s.clear()         # set()

# 길이
s = {1, 2, 3, 4, 5}
len(s)            # 5

🎯 2. μ…‹ μ—°μ‚° (μ½”ν…Œ ν•„μˆ˜!) ⭐⭐⭐

ν•©μ§‘ν•© (Union)

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

# 방법 1: | μ—°μ‚°μž
union = a | b
print(union)  # {1, 2, 3, 4, 5, 6}

# 방법 2: union() λ©”μ„œλ“œ
union = a.union(b)
print(union)  # {1, 2, 3, 4, 5, 6}

# μ—¬λŸ¬ μ…‹μ˜ ν•©μ§‘ν•©
c = {7, 8}
union = a | b | c
# {1, 2, 3, 4, 5, 6, 7, 8}

ꡐ집합 (Intersection) ⭐⭐⭐

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

# 방법 1: & μ—°μ‚°μž
inter = a & b
print(inter)  # {3, 4}

# 방법 2: intersection() λ©”μ„œλ“œ
inter = a.intersection(b)
print(inter)  # {3, 4}

# μ—¬λŸ¬ μ…‹μ˜ ꡐ집합
c = {3, 7, 8}
inter = a & b & c
# {3}

μ°¨μ§‘ν•© (Difference)

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

# a - b (aμ—λ§Œ μžˆλŠ” 것)
diff = a - b
print(diff)  # {1, 2}

# b - a (bμ—λ§Œ μžˆλŠ” 것)
diff = b - a
print(diff)  # {5, 6}

# difference() λ©”μ„œλ“œ
diff = a.difference(b)

λŒ€μΉ­μ°¨μ§‘ν•© (Symmetric Difference)

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

# λ‘˜ 쀑 ν•˜λ‚˜μ—λ§Œ μžˆλŠ” 것 (ꡐ집합 μ œμ™Έ)
sym_diff = a ^ b
print(sym_diff)  # {1, 2, 5, 6}

# symmetric_difference() λ©”μ„œλ“œ
sym_diff = a.symmetric_difference(b)

# 같은 의미
sym_diff = (a | b) - (a & b)
# {1, 2, 5, 6}

λΆ€λΆ„μ§‘ν•©/μƒμœ„μ§‘ν•© 체크

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

# aκ°€ b의 λΆ€λΆ„μ§‘ν•©?
print(a.issubset(b))    # True
print(a <= b)           # True

# aκ°€ b의 μ§„λΆ€λΆ„μ§‘ν•©? (κ°™μ§€ μ•Šμ€ λΆ€λΆ„μ§‘ν•©)
print(a < b)            # True

# bκ°€ a의 μƒμœ„μ§‘ν•©?
print(b.issuperset(a))  # True
print(b >= a)           # True

# bκ°€ a의 μ§„μƒμœ„μ§‘ν•©?
print(b > a)            # True

# μ„œλ‘œμ†Œ (ꡐ집합 μ—†μŒ)?
a = {1, 2, 3}
c = {4, 5, 6}
print(a.isdisjoint(c))  # True