행렬의 전치(Transpose)란?
행렬의 전치(transpose)는 원본 행렬의 행과 열을 서로 맞바꾼 새로운 행렬을 의미합니다. 즉, 행렬 A와 B가 있을 때 B의 행들이 A의 열들과 같다면, B는 A의 전치행렬이라고 할 수 있습니다.
m(i,j) 형태의 행렬을 m(j,i)로 변환하는 핵심 로직은 다음과 같습니다.
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
transpose[j][i] = matrix[i][j];프로그램 1: for 루프를 활용한 전치행렬 계산
첫 번째 예제는 for 루프를 사용해 사용자가 입력한 행렬의 전치행렬을 구하는 프로그램입니다. 먼저 행과 열의 개수를 입력받고, 행렬의 각 원소를 차례대로 입력한 뒤 전치 연산을 수행하여 결과를 출력합니다.
#include <stdio.h>
int main(){
int m, n, i, j, matrix[10][10], transpose[10][10];
printf("Enter rows and columns :\n");
scanf("%d%d", &m, &n);
printf("Enter elements of the matrix\n");
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
scanf("%d", &matrix[i][j]);
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
transpose[j][i] = matrix[i][j];
printf("Transpose of the matrix:\n");
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++)
printf("%d\t", transpose[i][j]);
printf("\n");
}
return 0;
}실행 결과
Enter rows and columns :
2 3
Enter elements of the matrix
1 2 3
2 4 5
Transpose of the matrix:
1 2
2 4
3 5위 실행 결과에서 볼 수 있듯이, 2×3 크기의 행렬을 입력하면 행과 열이 뒤바뀐 3×2 크기의 전치행렬이 출력됩니다.
프로그램 2: 매크로 상수를 활용한 전치행렬 계산
두 번째 프로그램은 #define 전처리기 지시문으로 행(ROW)과 열(COL)의 크기를 상수로 정의한 후 전치행렬을 계산합니다. 배열의 크기가 컴파일 시점에 고정되므로 코드가 더욱 간결하고 명확해진다는 장점이 있습니다.
#include<stdio.h>
#define ROW 2
#define COL 5
int main(){
int i, j, mat[ROW][COL], trans[COL][ROW];
printf("Enter matrix: \n");
// 행렬 입력
for(i = 0; i < ROW; i++){
for(j = 0; j < COL; j++){
scanf("%d", &mat[i][j]);
}
}
// 전치행렬 생성
for(i = 0; i < ROW; i++){
for(j = 0; j < COL; j++){
trans[j][i] = mat[i][j];
}
}
printf("\nTranspose matrix: \n");
// 전치행렬 출력
for(i = 0; i < COL; i++){
for(j = 0; j < ROW; j++){
printf("%d ", trans[i][j]);
}
printf("\n");
}
return 0;
}실행 결과
Enter matrix:
1 2 3 4 5
5 4 3 2 1
Transpose matrix:
1 5
2 4
3 3
4 2
5 12×5 크기의 행렬이 전치되어 5×2 크기의 행렬로 변환된 것을 확인할 수 있습니다. 두 프로그램 모두 같은 원리로 동작하지만, 프로그램 1은 실행 시점에 행렬의 크기를 정하는 반면, 프로그램 2는 컴파일 시점에 크기를 고정한다는 차이가 있습니다. 상황에 맞게 유연성과 단순함 중 하나를 선택하여 활용하면 됩니다.