안녕하세요! 이번 시간에는 집합 집합 (Set) 을 활용하여 알고리즘 문제를 풀이해 보겠습니다. 집합은 수학에서도 중요한 기초 개념이며, 프로그래밍에서도 자주 사용되는 데이터 구조입니다. 파이썬에서는 집합을 매우 간편하게 사용할 수 있는 내장 자료구조로 제공하고 있습니다.
문제 설명
문제: 두 개의 정수 배열이 주어질 때, 두 배열의 교집합(intersection)을 구하시오. 결과는 집합으로 반환해야 하며, 중복된 요소는 제외해야 합니다.
입력 형식
arr1: List[int] # 첫 번째 정수 배열
arr2: List[int] # 두 번째 정수 배열
출력 형식
Set[int] # 두 배열의 교집합
예제
입력: arr1 = [1, 2, 2, 3], arr2 = [2, 3, 4]
출력: {2, 3}
문제 해결 전략
이 문제를 해결하기 위해 사용할 수 있는 방법은 여러 가지가 있지만, 집합의 특성을 활용하는 것이 가장 효율적입니다. 집합은 중복 요소를 허용하지 않기 때문에, 주어진 배열을 집합으로 변환하면 자동으로 중복된 요소가 제거됩니다. 이어서 두 집합의 교집합을 계산하여 결과를 반환하면 됩니다.
단계별 접근
- 주어진 배열을 집합(set)으로 변환합니다.
- 두 집합 간의 교집합을 찾습니다.
- 교집합의 결과를 반환합니다.
코드 구현
이제 위의 단계를 바탕으로 Python 코드를 구현해보겠습니다.
def intersection(arr1, arr2):
set1 = set(arr1)
set2 = set(arr2)
return set1 & set2 # & 연산자는 교집합을 의미합니다.
코드 설명
코드는 매우 간단합니다. 먼저 주어진 두 배열을 집합으로 변환한 다음, & 연산자를 사용하여 교집합을 찾습니다. 이 연산자는 두 집합에서 공통적인 요소만을 반환합니다.
테스트 케이스
이제 코드가 제대로 작동하는지 확인하기 위해 몇 가지 테스트 케이스를 만들어 보겠습니다.
# 테스트 케이스
print(intersection([1, 2, 2, 3], [2, 3, 4])) # 출력: {2, 3}
print(intersection([5, 6, 7], [6, 8, 9])) # 출력: {6}
print(intersection([1, 1, 1], [2, 2, 2])) # 출력: set()
print(intersection([], [1, 2, 3])) # 출력: set()
테스트 결과 설명
각 테스트 케이스의 결과를 살펴보면:
- 첫 번째 케이스는 두 배열 모두 2와 3을 포함하고 있어 {2, 3}을 반환합니다.
- 두 번째 케이스는 집합 {6}을 반환합니다.
- 세 번째 케이스는 두 배열 간에 공통 요소가 없어 빈 집합을 반환합니다.
- 네 번째 케이스는 첫 번째 배열이 비어 있으므로 빈 집합을 반환합니다.
복잡도 분석
여기서 시간 복잡도를 분석해 보겠습니다. 배열의 크기를 n, m이라고 할 때:
- 각 배열을 집합으로 변환하는 데 O(n)과 O(m)의 시간이 걸립니다.
- 두 집합의 교집합을 찾는 데 O(min(n, m))의 시간이 소모됩니다.
결국, 전체 시간 복잡도는 O(n + m)입니다. 공간 복잡도는 집합을 저장하기 위한 공간이 필요하므로 O(n + m)입니다.
마무리
이번 강좌에서는 배열의 교집합을 구하는 문제를 통해 집합의 활용을 배워보았습니다. 집합은 매우 유용한 자료구조로, 이러한 문제뿐만 아니라 다양한 알고리즘 문제에서 사용될 수 있습니다. 다음 강좌에서도 유용한 알고리즘 기법을 다룰 예정이니 많은 기대 부탁드립니다!