Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬으로 행렬의 전치(Transpose) 구하기: 제자리(in-place) 알고리즘 완벽 정리

이 글에서는 주어진 문제를 해결하기 위한 접근 방식과 구현 방법을 자세히 알아보겠습니다.

문제 정의

하나의 행렬이 주어졌을 때, 그 행렬의 전치(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)입니다.

결론

이 글에서는 파이썬을 활용해 주어진 행렬의 전치를 제자리에서 구하는 방법을 살펴보았습니다. 대칭 위치의 원소를 교환하는 간단한 아이디어만으로 추가 배열 없이 효율적으로 문제를 해결할 수 있다는 점을 기억해 두시면, 행렬 회전 등 유사한 문제에도 응용할 수 있습니다.