Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 세트(Set)에서 주어진 크기의 모든 부분집합 구하기

이 글에서는 세트(Set)에서 주어진 크기만큼의 모든 부분집합을 구하는 방법을 알아보겠습니다.

문제 정의

세트와 원하는 부분집합의 크기 n이 주어졌을 때, 해당 크기를 가진 모든 부분집합을 출력해야 합니다.

Python에서는 표준 라이브러리인 itertools 모듈의 combinations() 함수를 사용하면 이 문제를 아주 간단하게 해결할 수 있습니다. 이 함수는 반복 가능한(iterable) 객체에서 지정한 개수만큼의 요소를 뽑는 모든 조합을 생성해 줍니다.

방법 1: itertools.combinations 기본 사용법

가장 기본적인 방법은 combinations() 함수가 반환하는 결과를 리스트로 변환하여 사용하는 것입니다. 이 경우 각 부분집합은 튜플(tuple) 형태로 반환됩니다.

# built-in module
import itertools

def findsubsets(s, n):
    return list(itertools.combinations(s, n))

# Driver Code
str_ = {'t','u','t','o','r'}
n = 2
print(findsubsets(str_, n))

출력 결과

[('u', 'r'), ('u', 'o'), ('u', 't'), ('r', 'o'), ('r', 't'), ('o', 't')]

출력을 보면 세트 {'t', 'u', 'o', 'r'}에서 2개의 요소를 뽑아 만들 수 있는 모든 조합이 튜플 형태로 나열된 것을 확인할 수 있습니다.

방법 2: map() 함수로 세트 형태 변환하기

조합 결과를 튜플이 아닌 세트(set) 형태로 얻고 싶다면 map() 함수를 활용할 수 있습니다. 각 조합에 set()을 적용하여 결과를 변환합니다.

# using combinations function in itertools
from itertools import combinations

def findsubsets(s, n):
    return list(map(set, itertools.combinations(s, n)))

str_ = {'t','u','t','o','r'}
n = 3
print(findsubsets(str_, n))

출력 결과

[{'u', 'o', 'r'}, {'u', 'r', 't'}, {'u', 'o', 't'}, {'o', 'r', 't'}]

방법 3: 리스트 컴프리헨션 활용하기

map() 대신 리스트 컴프리헨션(list comprehension)을 사용하면 더욱 파이써닉한 코드를 작성할 수 있습니다. 각 조합을 순회하면서 세트로 변환한 후 새로운 리스트에 담습니다.

# using combinations function in itertools and appending in a new list
def findsubsets(s, n):
    return [set(i) for i in itertools.combinations(s, n)]

str_ = {'t','u','t','o','r'}
n = 3
print(findsubsets(str_, n))

출력 결과

[{'u', 'o', 'r'}, {'u', 'r', 't'}, {'u', 'o', 't'}, {'o', 'r', 't'}]

위 코드에서 사용된 모든 변수는 지역 범위(local scope) 내에서 선언되며, 함수 호출 시 전달된 인자를 기반으로 동작합니다.

정리

이 글에서는 Python의 itertools.combinations() 함수를 활용하여 세트에서 주어진 크기의 모든 부분집합을 구하는 세 가지 방법을 살펴보았습니다. 기본적인 튜플 형태의 조합부터 map()과 리스트 컴프리헨션을 이용한 세트 변환까지, 상황에 맞는 방식을 선택하여 사용하시면 됩니다. 특히 대량의 데이터에서 조합을 다룰 때 itertools 모듈은 메모리 효율성이 뛰어나므로 실무에서도 유용하게 활용할 수 있습니다.