이 글에서는 주어진 문제를 해결하기 위한 접근 방식과 구현 방법을 자세히 알아보겠습니다.
문제 정의
하나의 행렬이 주어졌을 때, 그 행렬의 전치(transpose)를 같은 행렬에 저장한 뒤 결과를 출력하는 것이 목표입니다.
전치 행렬이란 행과 열을 서로 바꾼 행렬을 의미합니다. 쉽게 말해, 원래 행렬 A에서 A[i][j] 위치에 있던 값을 A[j][i] 위치로 옮기면 전치 행렬이 완성됩니다.
예를 들어 4×4 행렬의 경우, 첫 번째 행이 첫 번째 열로, 두 번째 행이 두 번째 열로 변환되는 식입니다.
구현 방법
효율적인 방법은 행렬의 상삼각형(triangular) 부분만 순회하면서 대칭 위치의 원소끼리 서로 교환(swap)하는 것입니다. 이렇게 하면 별도의 추가 행렬 없이 제자리(in-place)에서 전치를 수행할 수 있어 메모리 효율이 뛰어납니다.
아래 예제 코드를 확인해 보겠습니다.
예제 코드
N = 4
def transpose(A):
for i in range(N):
for j in range(i+1, N):
# 대각선 기준으로 대칭인 두 원소를 교환
A[i][j], A[j][i] = A[j][i], A[i][j]
# 드라이버 코드
A = [[1, 1, 1, 1],
[2, 2, 2, 2],
[3, 3, 3, 3],
[4, 4, 4, 4]]
transpose(A)
print("Modified matrix is")
for i in range(N):
for j in range(N):
print(A[i][j], " ", end='')
print()
실행 결과
Modified matrix is 1 2 3 4 1 2 3 4 1 2 3 4 1 2 3 4
코드 동작 원리
위 코드의 핵심은 이중 반복문의 범위 설정에 있습니다. 내부 반복문이 range(i+1, N)으로 시작하기 때문에, 대각선 아래쪽 원소는 건너뛰고 대각선 위쪽 원소만 처리합니다.
만약 전체 행렬을 순회하면서 교환한다면, 이미 바뀐 원소를 다시 되돌리는 실수가 발생할 수 있습니다. j>를 i+1부터 시작하면 각 원소 쌍을 정확히 한 번씩만 교환하게 되어 올바른 결과를 얻을 수 있습니다.
이 알고리즘의 시간 복잡도는 O(N²)이며, 추가 메모리를 사용하지 않으므로 공간 복잡도는 O(1)입니다.
결론
이 글에서는 파이썬을 활용해 주어진 행렬의 전치를 제자리에서 구하는 방법을 살펴보았습니다. 대칭 위치의 원소를 교환하는 간단한 아이디어만으로 추가 배열 없이 효율적으로 문제를 해결할 수 있다는 점을 기억해 두시면, 행렬 회전 등 유사한 문제에도 응용할 수 있습니다.