리스트에서 특정 합계 's'를 가지는 모든 부분집합(subset)을 찾아야 하는 경우가 있습니다. 이 문제는 리스트의 가능한 모든 조합을 생성한 뒤, 각 조합의 합이 목표값과 일치하는지 확인하고, 일치하는 조합만 콘솔에 출력하는 방식으로 해결할 수 있습니다.
예제
아래는 위 로직을 실제로 구현한 예제 코드입니다.
from itertools import combinations
def sub_set_sum(size, my_array, sub_set_sum):
for i in range(size+1):
for my_sub_set in combinations(my_array, i):
if sum(my_sub_set) == sub_set_sum:
print(list(my_sub_set))
my_size = 6
my_list = [21, 32, 56, 78, 45, 99, 0]
print("The list is :")
print(my_list)
subset_sum = 53
print("The result is :")
sub_set_sum(my_size, my_list, subset_sum)
출력 결과
The list is : [21, 32, 56, 78, 45, 99, 0] The result is : [21, 32] [21, 32, 0]
코드 설명
itertools 모듈에서 combinations 함수를 가져와 환경에 임포트합니다.
'sub_set_sum'이라는 이름의 메서드를 정의하며, 이 메서드는 리스트의 크기와 리스트 자체를 매개변수로 받습니다.
0부터 리스트 크기까지 반복하면서, combinations 메서드를 사용해 각 길이별로 만들 수 있는 모든 조합을 생성합니다.
생성된 조합의 합이 목표 합계와 같으면 해당 조합을 리스트로 변환하여 콘솔에 출력합니다.
메서드 외부에서 리스트의 크기를 나타내는 변수를 정의합니다.
숫자 요소들로 구성된 리스트를 정의하고 콘솔에 출력합니다.
찾고자 하는 부분집합의 목표 합계 값(여기서는 53)을 정의합니다.
필요한 매개변수를 모두 전달하여 메서드를 호출합니다.
조건에 맞는 부분집합들이 콘솔에 차례대로 출력됩니다.
위 예제에서는 [21, 32]와 [21, 32, 0] 두 개의 부분집합이 합계 53과 일치하므로 두 결과가 모두 출력되는 것을 확인할 수 있습니다. 참고로 0은 합계에 영향을 주지 않기 때문에, 동일한 요소 집합에 0이 포함된 조합도 별도의 답으로 출력됩니다.