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

Python으로 주어진 합이 되는 K 길이 그룹 찾기

개요

리스트에서 주어진 합계(N)가 되는 길이 K의 그룹(조합)을 찾아야 하는 경우가 있습니다. 이럴 때 빈 리스트와 함께 itertools 모듈의 product 메서드, 그리고 내장 함수인 sumappend 메서드를 활용하면 손쉽게 해결할 수 있습니다.

예제 코드

아래는 실제 동작을 보여주는 예제입니다.

from itertools import product

my_list = [45, 32, 67, 11, 88, 90, 87, 33, 45, 32]
print("The list is : ")
print(my_list)

N = 77
print("The value of N is ")
print(N)
K = 2
print("The value of K is ")
print(K)

my_result = []
for sub in product(my_list, repeat = K):
   if sum(sub) == N:
      my_result.append(sub)

print("The result is : " )
print(my_result)

실행 결과

The list is :
[45, 32, 67, 11, 88, 90, 87, 33, 45, 32]
The value of N is
77
The value of K is
2
The result is :
[(45, 32), (45, 32), (32, 45), (32, 45), (45, 32), (45, 32), (32, 45), (32, 45)]

코드 설명

  • 필요한 패키지(itertools.product)를 환경에 임포트합니다.

  • 정수 요소로 구성된 리스트를 정의하고 콘솔에 출력합니다.

  • 목표 합계를 나타내는 N과 그룹의 길이를 나타내는 K 값을 정의한 뒤 콘솔에 출력합니다.

  • 결과를 저장할 빈 리스트를 하나 생성합니다.

  • product 메서드를 사용해 리스트 요소들로 만들 수 있는 길이 K의 모든 순서쌍(중복 허용)을 생성하고, 각 조합의 합이 N과 같은지 확인합니다.

  • 합이 N과 일치하는 조합은 미리 만들어 둔 빈 리스트에 append 메서드로 추가합니다.

  • 마지막으로 최종 결과 리스트를 콘솔에 출력합니다.

참고 사항

product(my_list, repeat=K)는 데카르트 곱(Cartesian product)을 계산하므로 순서를 구분합니다. 따라서 (45, 32)와 (32, 45)처럼 같은 값이라도 순서가 다르면 별도의 결과로 포함됩니다. 순서에 상관없는 조합만 원한다면 itertools.combinations_with_replacement 또는 combinations를 대신 사용할 수 있습니다.