이번 글에서는 사용자로부터 두 개의 N×N 행렬을 입력받아 그 곱셈 결과를 화면에 출력하는 파이썬 프로그램을 살펴봅니다. 행렬 데이터는 중첩 리스트(nested list)로 저장하고, 연산 과정은 중첩 for 반복문으로 처리합니다.
알고리즘
- 입력 단계: 두 개의 행렬을 사용자로부터 입력받습니다.
- 순회 단계: 중첩 for 반복문으로 첫 번째 행렬의 각 행과 두 번째 행렬의 각 열을 차례대로 순회합니다.
- 연산 단계: 모든 요소가 0으로 초기화된 결과 행렬(resultant matrix)을 준비합니다. 첫 번째 행렬의 행 요소와 두 번째 행렬의 열 요소를 하나씩 곱한 뒤 모두 더하면, 그 합이 결과 행렬의 해당 위치 값이 됩니다.
예제 코드
# 두 행렬을 곱하는 프로그램
A = []
n = int(input("N x N 행렬의 크기 N을 입력하세요: "))
print("행렬의 원소를 입력하세요 ::>")
for i in range(n):
row = [] # 행을 저장할 임시 리스트
for j in range(n):
row.append(int(input())) # 입력값을 행 리스트에 추가
A.append(row) # 완성된 행을 행렬 A에 추가
print(A)
# 2차원 배열을 행렬 형태로 출력
print("행렬 형태로 배열 출력")
for i in range(n):
for j in range(n):
print(A[i][j], end=" ")
print() # 줄바꿈
B = []
n = int(input("N x N 행렬의 크기 N을 입력하세요 : ")) # 여기서는 3 입력
# 2차원 배열을 저장할 리스트 사용
# 사용자 입력을 받아 리스트에 저장 (여기서는 1~9 입력)
print("행렬의 원소를 입력하세요 ::>")
for i in range(n):
row = [] # 행을 저장할 임시 리스트
for j in range(n):
row.append(int(input())) # 입력값을 행 리스트에 추가
B.append(row) # 완성된 행을 행렬 B에 추가
print(B)
# 2차원 배열을 행렬 형태로 출력
print("행렬 형태로 배열 출력")
for i in range(n):
for j in range(n):
print(B[i][j], end=" ")
print()
# 행렬 곱셈 수행
result = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
for i in range(len(A)):
for j in range(len(B[0])):
for k in range(len(B)):
result[i][j] += A[i][k] * B[k][j]
print("결과 행렬은 다음과 같습니다 ::>")
for r in result:
print(r)
핵심 코드 분석
행렬 곱셈 로직의 핵심은 아래처럼 세 겹으로 중첩된 반복문입니다.
result = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
for i in range(len(A)):
for j in range(len(B[0])):
for k in range(len(B)):
result[i][j] += A[i][k] * B[k][j]
- i: 결과 행렬의 행(row) 인덱스
- j: 결과 행렬의 열(column) 인덱스
- k: 두 행렬의 요소를 곱한 값을 누적으로 더하기 위해 사용하는 인덱스
result[i][j] += A[i][k] * B[k][j] 연산은 선형대수학에서 정의하는 행렬 곱셈 공식을 그대로 코드로 옮긴 것입니다. 참고로 이 삼중 반복문 방식의 시간 복잡도는 O(N³)입니다.
실행 결과
N x N 행렬의 크기 N을 입력하세요: 3 행렬의 원소를 입력하세요 ::> 2 1 4 2 1 2 3 4 3 [[2, 1, 4], [2, 1, 2], [3, 4, 3]] 행렬 형태로 배열 출력 2 1 4 2 1 2 3 4 3 N x N 행렬의 크기 N을 입력하세요 : 3 행렬의 원소를 입력하세요 ::> 1 2 3 4 5 6 7 8 9 [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 행렬 형태로 배열 출력 1 2 3 4 5 6 7 8 9 결과 행렬은 다음과 같습니다 ::> [34, 41, 48] [20, 25, 30] [40, 50, 60]