파이썬 코딩테스트 강좌, 집합 표현하기

안녕하세요! 이번 시간에는 집합 집합 (Set) 을 활용하여 알고리즘 문제를 풀이해 보겠습니다. 집합은 수학에서도 중요한 기초 개념이며, 프로그래밍에서도 자주 사용되는 데이터 구조입니다. 파이썬에서는 집합을 매우 간편하게 사용할 수 있는 내장 자료구조로 제공하고 있습니다.

문제 설명

문제: 두 개의 정수 배열이 주어질 때, 두 배열의 교집합(intersection)을 구하시오. 결과는 집합으로 반환해야 하며, 중복된 요소는 제외해야 합니다.

입력 형식

arr1: List[int]  # 첫 번째 정수 배열
arr2: List[int]  # 두 번째 정수 배열

출력 형식

Set[int]  # 두 배열의 교집합

예제

입력: arr1 = [1, 2, 2, 3], arr2 = [2, 3, 4]
출력: {2, 3}

문제 해결 전략

이 문제를 해결하기 위해 사용할 수 있는 방법은 여러 가지가 있지만, 집합의 특성을 활용하는 것이 가장 효율적입니다. 집합은 중복 요소를 허용하지 않기 때문에, 주어진 배열을 집합으로 변환하면 자동으로 중복된 요소가 제거됩니다. 이어서 두 집합의 교집합을 계산하여 결과를 반환하면 됩니다.

단계별 접근

  1. 주어진 배열을 집합(set)으로 변환합니다.
  2. 두 집합 간의 교집합을 찾습니다.
  3. 교집합의 결과를 반환합니다.

코드 구현

이제 위의 단계를 바탕으로 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)입니다.

마무리

이번 강좌에서는 배열의 교집합을 구하는 문제를 통해 집합의 활용을 배워보았습니다. 집합은 매우 유용한 자료구조로, 이러한 문제뿐만 아니라 다양한 알고리즘 문제에서 사용될 수 있습니다. 다음 강좌에서도 유용한 알고리즘 기법을 다룰 예정이니 많은 기대 부탁드립니다!