행렬의 전치(Transpose)란 행렬을 주대각선을 기준으로 뒤집는 연산을 말합니다. 전치를 수행하면 기존 행렬의 행 요소는 열로, 열 요소는 행으로 위치가 바뀌게 됩니다.
행렬 전치의 개념
예를 들어 3×3 행렬을 전치하면 다음과 같이 변합니다.
전치 전 행렬: 1 2 3 4 5 6 7 8 9 전치 후 행렬: 1 4 7 2 5 8 3 6 9
위 예시에서 볼 수 있듯이, 원래 행렬의 첫 번째 행(1, 2, 3)이 전치 후에는 첫 번째 열로 이동한 것을 확인할 수 있습니다.
C# 코드 예제
다음은 C#에서 사용자로부터 행렬의 크기와 요소를 입력받아 전치 행렬을 구하는 전체 코드입니다.
using System;
public class Demo {
public static void Main() {
int i, j, m, n;
int[] arr1 = new int[30, 30];
int[] arr2 = new int[30, 30];
Console.Write("\n행렬의 행과 열의 개수를 입력하세요 :\n");
Console.Write("입력된 행의 개수 = ");
m = Convert.ToInt32(Console.ReadLine());
Console.Write("입력된 열의 개수 = ");
n = Convert.ToInt32(Console.ReadLine());
Console.Write("행렬의 요소를 입력하세요...\n");
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
Console.Write("\n [{0}],[{1}] : ", i, j);
arr1[i, j] = Convert.ToInt32(Console.ReadLine());
}
}
Console.Write("\n\n전치 전 행렬:\n");
for (i = 0; i < m; i++) {
Console.Write("\n");
for (j = 0; j < n; j++)
Console.Write("{0}\t", arr1[i, j]);
}
// 전치 연산: 행과 열의 인덱스를 서로 교환하여 저장
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
arr2[j, i] = arr1[i, j];
}
}
Console.Write("\n\n전치 후 행렬: ");
for (i = 0; i < m; i++) {
Console.Write("\n");
for (j = 0; j < n; j++) {
Console.Write("{0}\t", arr2[i, j]);
}
}
Console.Write("\n\n");
}
}코드 핵심 로직 설명
전치 연산의 핵심은 다음 한 줄입니다.
arr2[j, i] = arr1[i, j];
원본 배열 arr1의 [i, j] 위치에 있는 값을 결과 배열 arr2의 [j, i] 위치에 저장함으로써, 행과 열의 인덱스를 서로 교환하게 됩니다. 이렇게 하면 별도의 복잡한 알고리즘 없이 간단한 이중 반복문만으로 전치 행렬을 얻을 수 있습니다.
실행 결과
위 프로그램을 실행하고 행과 열의 개수, 그리고 행렬의 각 요소를 입력하면 다음과 같은 결과가 출력됩니다.
행렬의 행과 열의 개수를 입력하세요 : 입력된 행의 개수 = 3 입력된 열의 개수 = 3 행렬의 요소를 입력하세요... [0],[0] : 1 [0],[1] : 2 [0],[2] : 3 [1],[0] : 4 [1],[1] : 5 [1],[2] : 6 [2],[0] : 7 [2],[1] : 8 [2],[2] : 9 전치 전 행렬: 1 2 3 4 5 6 7 8 9 전치 후 행렬: 1 4 7 2 5 8 3 6 9
이처럼 C#의 2차원 배열과 이중 반복문을 활용하면 행렬 전치를 손쉽게 구현할 수 있습니다. 입력 크기를 자유롭게 조절할 수 있어 정방행렬뿐만 아니라 다양한 크기의 행렬에도 동일한 방식으로 적용할 수 있습니다.