개요
두 개의 행렬(중첩 리스트)이 있을 때, 첫 번째 행렬의 모든 행이 두 번째 행렬의 같은 위치 행과 최소 한 개 이상의 공통 요소를 가지는지 확인해야 하는 경우가 있습니다. 이럴 때는 간단한 반복문과 플래그(flag) 변수를 활용하면 손쉽게 해결할 수 있습니다.
예제
아래는 이를 구현한 예제 코드입니다.
my_list_1 = [[3, 16, 1], [2, 4], [4, 31, 31]]
my_list_2 = [[42, 16, 12], [42, 8, 12], [31, 7, 10]]
print("The first list is :")
print(my_list_1)
print("The second list is :")
print(my_list_2)
my_result = True
for idx in range(0, len(my_list_1)):
temp = False
for element in my_list_1[idx]:
if element in my_list_2[idx]:
temp = True
break
if not temp:
my_result = False
break
if(temp == True):
print("The two matrices contain common elements")
else:
print("The two matrices don't contain common elements")출력 결과
The first list is : [[3, 16, 1], [2, 4], [4, 31, 31]] The second list is : [[42, 16, 12], [42, 8, 12], [31, 7, 10]] The two matrices don't contain common elements
코드 설명
두 개의 리스트(리스트 안에 리스트가 들어 있는 구조)가 정의되고 콘솔에 출력됩니다.
최종 결과를 저장할 변수가 Boolean 값
True로 초기화됩니다.첫 번째 리스트를 행 단위로 순회하며, 각 행을 검사하기 전에 임시 변수를 Boolean 값
False로 설정합니다.현재 행의 요소가 두 번째 리스트의 같은 인덱스 행에 존재하면, 임시 변수를 Boolean 값
True로 변경합니다.공통 요소를 찾으면
break문으로 내부 반복문을 즉시 종료하여 불필요한 비교를 줄입니다.내부 반복문이 끝난 후에도 임시 변수가
False라면 해당 행에 공통 요소가 없다는 의미이므로, 결과 변수를False로 바꾸고 전체 반복문을 종료합니다.마지막으로 임시 변수의 값에 따라 적절한 메시지가 콘솔에 출력됩니다.
더 간결한 대안: 집합과 all() 활용
위 코드는 로직을 단계별로 명확히 보여주지만, 파이썬에서는 zip(), all()과 집합 교집합 연산을 조합하면 훨씬 간결하고 가독성 좋게 표현할 수 있습니다.
result = all(bool(set(a) & set(b)) for a, b in zip(my_list_1, my_list_2))
if result:
print("두 행렬은 공통 요소를 포함합니다")
else:
print("두 행렬은 공통 요소를 포함하지 않습니다")set(a) & set(b)는 두 행의 교집합을 구하는 연산으로, 리스트의 in 검색(O(n))보다 집합 기반 조회(O(1))가 빠르기 때문에 데이터가 클수록 성능 면에서도 유리합니다. 또한 코드의 의도를 한 줄로 명확하게 드러낼 수 있다는 장점이 있습니다.