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

Python으로 리스트에서 특정 합을 만족하는 모든 삼중항(Triplet) 찾는 방법

숫자로 이루어진 리스트에서 세 개의 요소를 더했을 때 특정 합이 되는 조합을 찾아야 하는 경우가 자주 있습니다. 이렇게 세 개의 요소로 이루어진 조합을 '삼중항(Triplet)'이라고 부릅니다. 하나의 리스트 안에는 이러한 삼중항이 여러 개 존재할 수 있습니다. 예를 들어, 합계 10은 1+6+3으로도 만들 수 있고 1+5+4로도 만들 수 있습니다. 이 글에서는 주어진 숫자 리스트에서 이러한 모든 삼중항을 찾는 방법을 알아보겠습니다.

range와 임시 변수 활용하기

가장 전통적인 접근 방식은 임시 변수를 사용하는 것입니다. 이 변수들에 리스트의 요소들을 담고, 그 합이 원하는 값과 일치하는지 확인합니다. 조건을 만족하는 조합은 최종 결과 집합에 계속 누적됩니다.

예제

def SumTriplets(listA, sum):
    trpltcnt = 0
    res = []

    for i in range(0, len(listA) - 1):

        s = set()
        tmp = []

        # 첫 번째 요소 추가
        tmp.append(listA[i])

        current_sum = sum - listA[i]

        for j in range(i + 1, len(listA)):

            if (current_sum - listA[j]) in s:
                trpltcnt += 1

                # 두 번째 요소 추가
                tmp.append(listA[j])

                # 세 번째 요소 추가
                tmp.append(current_sum - listA[j])

                # 튜플을 최종 리스트에 추가
                res.append(tuple(tmp))
                tmp.pop(2)
                tmp.pop(1)
            s.add(listA[j])

    return res


listA = [11,12,13,14,15,16,17,18,19,20]

print("Required triplets:\n",SumTriplets(listA, 40))

출력

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Required triplets:
[(11, 15, 14), (11, 16, 13), (11, 17, 12), (12, 15, 13)]

itertools의 combinations 활용하기

파이썬 표준 라이브러리인 itertools의 combinations 함수를 사용하면 훨씬 간결하게 문제를 해결할 수 있습니다. combinations는 리스트에서 만들 수 있는 모든 3개 요소 조합을 생성하고, filter 함수와 함께 사용해 합이 원하는 값(여기서는 40)이 되는 조합만 걸러냅니다.

예제

from itertools import combinations

listA = [11,12,13,14,15,16,17,18,19,20]

def fsum(val):
    return sum(val) == 40

res = list(filter(fsum,list(combinations(listA, 3))))

print("Required triplets:\n",res)

출력

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

Required triplets:
[(11, 12, 17), (11, 13, 16), (11, 14, 15), (12, 13, 15)]