개요
리스트 안에 여러 개의 행(내부 리스트)이 있을 때, 두 요소의 합이 특정 키 값과 일치하는 쌍이 포함된 행만 골라내야 하는 경우가 있습니다. 이럴 때는 별도의 함수를 정의하여 각 행을 검사하고, 조건을 만족하는 행만 새로운 리스트로 추출하면 됩니다.
아래 예제에서는 중첩 반복문을 사용해 한 행 내의 모든 요소 쌍을 확인하고, 그 합이 키 값과 같으면 True를 반환하는 방식으로 문제를 해결합니다.
예제 코드
def find_sum_pair(val, key):
for index in range(len(val)):
for ix in range(index + 1, len(val)):
if val[index] + val[ix] == key:
return True
return False
my_list = [[71, 5, 21, 6], [34, 21, 2, 71], [21, 2, 34, 5], [6, 9, 21, 42]]
print("The list is :")
print(my_list)
my_key = 76
print("The key is ")
print(my_key)
my_result = [element for element in my_list if find_sum_pair(element, my_key)]
print("The resultant list is :")
print(my_result)실행 결과
The list is : [[71, 5, 21, 6], [34, 21, 2, 71], [21, 2, 34, 5], [6, 9, 21, 42]] The key is 76 The resultant list is : [[71, 5, 21, 6]]
동작 원리 상세 설명
find_sum_pair 함수 정의: 리스트와 키 값을 매개변수로 받는 함수를 정의합니다.
중첩 반복문으로 모든 쌍 탐색: 바깥쪽 반복문은 첫 번째 요소를, 안쪽 반복문은 그 다음 요소부터 순회하며 서로 다른 인덱스에 있는 두 요소의 조합을 모두 확인합니다.
합 비교: 두 요소의 합이 두 번째 매개변수인 키 값과 일치하는지 검사합니다.
조건 만족 시: 일치하는 쌍을 찾으면 즉시
True를 반환하여 불필요한 연산을 줄입니다.조건 불만족 시: 끝까지 탐색했는데도 일치하는 쌍이 없다면
False를 반환합니다.데이터 준비: 함수 외부에서 리스트의 리스트(중첩 리스트)를 정의하고 콘솔에 출력합니다.
키 값 설정: 찾고자 하는 합계 목표값인 키를 변수에 저장합니다.
리스트 컴프리헨션 활용: 리스트 컴프리헨션을 사용해 각 행을 순회하면서
find_sum_pair함수를 호출하고,True가 반환된 행만 결과 리스트에 담습니다.결과 출력: 최종 필터링된 리스트를 콘솔에 출력합니다.
추가 팁: 더 효율적인 접근 방법
위 방법의 시간 복잡도는 O(n²)입니다. 행의 길이가 길어지면 성능이 떨어질 수 있으므로, 집합(set)을 활용하면 O(n)으로 개선할 수 있습니다.
def find_sum_pair_fast(val, key):
seen = set()
for num in val:
if key - num in seen:
return True
seen.add(num)
return False각 요소를 순회하며 '키 값에서 현재 요소를 뺀 값'이 이미 등장했는지 집합에서 O(1)로 확인하는 방식입니다. 대용량 데이터를 다룰 때는 이 방법을 사용하는 것이 좋습니다.