이 글에서는 파이썬을 이용해 행렬의 전치(transpose)를 구하는 방법을 단계별로 알아보겠습니다.
문제 정의
주어진 문제는 다음과 같습니다.
문제: 하나의 행렬이 주어졌을 때, 그 행렬의 전치 행렬을 구하여 출력해야 합니다.
행렬의 전치란 원래 행렬 A에서 A[i][j] 위치에 있던 값을 A[j][i] 위치로 바꾼 새로운 행렬을 의미합니다. 쉽게 말해, 행과 열을 서로 뒤바꾸는 연산입니다.
그럼 실제 구현 예제를 통해 개념을 자세히 살펴보겠습니다.
방법 1: 새로운 행렬을 만들어 전치 결과 저장하기
첫 번째 방법은 입력 행렬의 전치 결과를 별도의 새로운 행렬 B에 저장하는 방식입니다. 원본 행렬을 유지해야 하는 경우에 유용합니다.
예제 코드
def transpose(A, B):
for i in range(M):
for j in range(N):
B[i][j] = A[j][i]
# 드라이버 코드
M = N = 4
A = [ [0, 1, 1, 0],
[0, 2, 0, 2],
[0, 3, 0, 3],
[0, 0, 4, 4]]
B = [[0 for x in range(M)] for y in range(N)] # 빈 행렬 생성
transpose(A, B)
print("전치된 행렬은 다음과 같습니다:")
for i in range(N):
for j in range(N):
print(B[i][j], " ", end='')
print()실행 결과
전치된 행렬은 다음과 같습니다: 0 0 0 0 0 2 3 0 0 3 0 4 0 0 4 4
방법 2: 입력 행렬 자체에 전치 결과 저장하기 (제자리 전치)
두 번째 방법은 추가 메모리 없이 입력 행렬 자체를 수정하는 제자리(in-place) 방식입니다. 대각선 기준으로 위쪽 삼각형의 요소들만 아래쪽과 맞바꾸면 되므로 효율적입니다.
예제 코드
# 함수 정의
def transpose(A):
for i in range(M):
for j in range(i+1, N):
A[i][j], A[j][i] = A[j][i], A[i][j]
M = N = 4
A = [ [0, 1, 1, 0],
[0, 2, 0, 2],
[0, 3, 0, 3],
[0, 0, 4, 4]]
transpose(A)
print("전치된 행렬은 다음과 같습니다:")
for i in range(M):
for j in range(N):
print(A[i][j], " ", end='')
print()실행 결과
전치된 행렬은 다음과 같습니다: 0 0 0 0 0 2 3 0 0 3 0 4 0 0 4 4
추가 팁: zip() 함수 활용하기
파이썬에서는 내장 함수인 zip()을 사용하면 한 줄로 전치 행렬을 만들 수 있습니다.
A = [[0, 1, 1, 0],
[0, 2, 0, 2],
[0, 3, 0, 3],
[0, 0, 4, 4]]
T = [list(row) for row in zip(*A)]
print(T)zip(*A)는 각 행을 인수로 풀어서(unpacking) 같은 인덱스의 요소들을 묶어주기 때문에, 결과적으로 열 단위로 데이터가 재배열되어 전치 행렬이 완성됩니다.
결론
이번 글에서는 파이썬에서 행렬의 전치를 구하는 두 가지 방법, 즉 새로운 행렬에 결과를 저장하는 방법과 입력 행렬을 직접 수정하는 제자리 방식을 학습했습니다. 또한 zip(*A)를 활용한 파이썬다운 간결한 방법도 함께 소개했습니다. 상황에 따라 메모리 효율성과 코드 가독성을 고려해 적절한 방법을 선택하시기 바랍니다.