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

파이썬으로 특정 합계를 가진 모든 부분집합 구하기


리스트에서 특정 합계 '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이 포함된 조합도 별도의 답으로 출력됩니다.