안녕하세요! 오늘은 파이썬에서 정말 유용하게 쓰이는 set
에 대해 이야기해 보려고 해요.
특히 알고리즘 문제를 풀 때 set
이 얼마나 강력한 도구인지 알아보는 시간을 가져보려고 합니다.
set
이란?
set
은 집합을 나타내는 자료형이에요.
중복을 허용하지 않고, 순서가 없는 데이터 구조죠.
이 말만 들으면 좀 심심하게 느껴질 수 있지만, 알고리즘 문제에서는 정말 강력한 도구랍니다.
쉽게 말하면, set
은 이런 상황에서 빛을 발해요.
중복 제거*가 필요할 때*
빠르게 포함 여부*를 확인해야할 때*
교집합, 합집합 같은 연산이 필요할 때
set
함수 문법
set
의 주요 함수와 문법은 다음과 같습니다.
set(iterable)
- iterable:
list
,tuple
,string
등 반복 가능한 객체를 전달하여set
을 생성합니다.
주요 메서드와 사용법
add(element)
- 집합에 새로운 요소를 추가합니다.
my_set = {1, 2, 3}
my_set.add(4)
print(my_set) # {1, 2, 3, 4}
remove(element)
- 특정 요소를 제거합니다. 요소가 없으면
KeyError
를 발생시킵니다.
- 특정 요소를 제거합니다. 요소가 없으면
my_set = {1, 2, 3}
my_set.remove(2)
print(my_set) # {1, 3}
discard(element)
- 특정 요소를 제거합니다. 요소가 없어도 에러를 발생시키지 않습니다.
my_set = {1, 2, 3}
my_set.discard(4) # 에러 없음
print(my_set) # {1, 2, 3}
union(other_set)
또는|
- 두 집합의 합집합을 반환합니다.
set1 = {1, 2, 3}
set2 = {3, 4, 5}
print(set1.union(set2)) # {1, 2, 3, 4, 5}
intersection(other_set)
또는&
- 두 집합의 교집합을 반환합니다.
set1 = {1, 2, 3}
set2 = {2, 3, 4}
print(set1.intersection(set2)) # {2, 3}
difference(other_set)
또는-
- 두 집합의 차집합을 반환합니다.
set1 = {1, 2, 3}
set2 = {3, 4, 5}
print(set1.difference(set2)) # {1, 2}
symmetric_difference(other_set)
또는^
- 두 집합의 대칭 차집합을 반환합니다.
set1 = {1, 2, 3}
set2 = {3, 4, 5}
print(set1.symmetric_difference(set2)) # {1, 2, 4, 5}
알고리즘 문제에서 set
활용하기
1. 중복 제거하기
가장 간단한 활용법입니다! 문제에서 "중복된 요소를 제거하세요"라는 말이 나오면 바로 set
을 떠올려 보세요.
# 예제 문제: 주어진 리스트에서 중복된 숫자를 제거하라
nums = [1, 2, 2, 3, 4, 4, 5]
unique_nums = list(set(nums))
print(unique_nums) # [1, 2, 3, 4, 5]
2. 교집합, 합집합 구하기
여러 집합의 공통 요소나 모든 요소를 구해야 할 때도 set
이 유용합니다.
# 예제 문제: 두 배열의 교집합 구하기
nums1 = [1, 2, 3, 4]
nums2 = [3, 4, 5, 6]
intersection = list(set(nums1) & set(nums2))
print(intersection) # [3, 4]
3. 빠르게 포함 여부 확인하기
set
은 포함 여부를 확인할 때 리스트보다 훨씬 빠른 성능을 보여줍니다. 리스트는 요소를 하나씩 확인하지만, set
은 해시를 사용하기 때문이에요.
# 예제 문제: 특정 값이 존재하는지 확인하라
nums = {1, 2, 3, 4, 5}
print(3 in nums) # True
print(6 in nums) # False
이런 속도 차이 덕분에 set
은 대용량 데이터를 처리할 때도 아주 유용하답니다.
알고리즘 문제에서 set
을 활용한 팁
1. 문제를 잘 읽자!
문제에서 "중복을 허용하지 않는다"거나 "순서가 중요하지 않다"라는 표현이 나오면 set
이 필요할 가능성이 높습니다.
2. 시간 복잡도를 고려하자
set
의 주요 연산은 평균적으로 O(1)입니다.
그래서 리스트보다 훨씬 빠르게 포함 여부를 확인할 수 있답니다.
3. set
메서드 익히기
add
, remove
, union
, intersection
같은 메서드를 잘 활용하면 문제 해결 속도가 올라갑니다.
예를 들어 다음과 같이 사용할 수 있습니다.
# 요소 추가 및 제거
my_set = {1, 2, 3}
my_set.add(4) # {1, 2, 3, 4}
my_set.remove(2) # {1, 3, 4}