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

자바(Java)로 행렬의 전치(Transpose) 구하기 – 초보자를 위한 완벽 가이드

이 글에서는 자바(Java)를 사용하여 행렬의 전치(transpose)를 구하는 방법을 알아보겠습니다. 행렬은 요소들이 행(row)과 열(column)로 배열된 구조를 가지며, m개의 행과 n개의 열을 가진 행렬을 m × n 행렬이라고 부릅니다.

행렬의 전치란 원래 행렬의 행과 열을 서로 맞바꾸는 연산입니다. 즉, 행을 열로, 열을 행으로 변환하여 새로운 행렬을 만드는 것입니다. 수학적으로 표현하면, 원래 행렬 A의 요소가 A[i][j]라면 전치 행렬 Aᵀ의 해당 위치 요소는 Aᵀ[j][i]가 됩니다.

예시 입출력

아래 예시를 통해 전치 과정을 쉽게 이해할 수 있습니다.

입력 행렬:

행렬:
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4

기대 출력 결과:

전치 행렬:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4

원래 행렬에서 각 행이 열로 변환된 것을 확인할 수 있습니다. 첫 번째 행 [1, 1, 1, 1]은 전치 후 첫 번째 열이 되고, 두 번째 행 [2, 2, 2, 2]는 두 번째 열이 되는 방식입니다.

알고리즘

행렬의 전치를 구하는 절차는 다음과 같습니다.

Step 1 - 시작(START)
Step 2 - 정수형 행렬 두 개(input_matrix, result_matrix)를 선언한다.
Step 3 - 입력 행렬의 값을 정의한다.
Step 4 - 두 개의 for 반복문으로 행렬의 모든 요소를 순회하며,
         input_matrix의 [i][j] 위치 값을 result_matrix의 [j][i] 위치에 대입한다.
Step 5 - result_matrix를 출력한다.
Step 6 - 종료(STOP)

핵심 아이디어는 간단합니다. [i][j] ↔ [j][i] 위치 교환 규칙만 적용하면 되기 때문에, 이중 반복문 안에서 인덱스 순서만 뒤집어 대입하면 전치 행렬이 완성됩니다.

예제 1: main 메서드에서 모든 로직 처리

첫 번째 방법은 모든 연산을 main 메서드 안에서 한 번에 처리하는 방식입니다. 코드가 단순하고 흐름을 파악하기 쉬워 학습용으로 적합합니다.

public class MatrixTranspose {
   static final int matrix_size = 4;
   public static void main (String[] args) {
      int input_matrix[][] = {
         {1, 1, 1, 1},
         {2, 2, 2, 2},
         {3, 3, 3, 3},
         {4, 4, 4, 4}
      };
      System.out.println("The matrix is defined as: \n");
      for (int i = 0; i < matrix_size; i++) {
         for (int j = 0; j < matrix_size; j++) {
            System.out.print(input_matrix[i][j] + " ");
         }
         System.out.println();
      }
      int result_matrix[][] = new int[matrix_size][matrix_size];
      for (int i = 0; i < matrix_size; i++)
         for (int j = 0; j < matrix_size; j++)
            result_matrix[i][j] = input_matrix[j][i];
      System.out.println("\nThe transpose of the matrix is: ");
      for (int i = 0; i < matrix_size; i++) {
         for (int j = 0; j < matrix_size; j++) {
            System.out.print(result_matrix[i][j] + " ");
         }
         System.out.println();
      }
   }
}

코드 설명

  • matrix_size: 행렬의 크기를 나타내는 상수로, 여기서는 4×4 행렬을 다룹니다.
  • 첫 번째 이중 반복문은 입력 행렬을 화면에 출력합니다.
  • result_matrix[i][j] = input_matrix[j][i]; 부분이 바로 전치 연산의 핵심입니다.
  • 마지막 이중 반복문은 전치된 결과 행렬을 출력합니다.

실행 결과

The matrix is defined as:

1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4

The transpose of the matrix is:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4

예제 2: 객체 지향 방식으로 메서드 분리

두 번째 방법은 전치 연산 로직을 별도의 메서드로 분리하여 객체 지향 프로그래밍(OOP) 스타일로 작성한 것입니다. 코드의 재사용성과 유지보수성이 향상되어 실무에서 더 권장되는 구조입니다.

public class MatrixTranspose {
   static final int matrix_size = 4;
   static void transpose(int input_matrix[][]) {
      int result_matrix[][] = new int[matrix_size][matrix_size];
      for (int i = 0; i < matrix_size; i++)
         for (int j = 0; j < matrix_size; j++)
            result_matrix[i][j] = input_matrix[j][i];
      System.out.println("\nThe transpose of the matrix is: ");
      for (int i = 0; i < matrix_size; i++) {
         for (int j = 0; j < matrix_size; j++) {
            System.out.print(result_matrix[i][j] + " ");
         }
         System.out.println();
      }
   }
   public static void main (String[] args) {
      int input_matrix[][] = {
         {1, 1, 1, 1},
         {2, 2, 2, 2},
         {3, 3, 3, 3},
         {4, 4, 4, 4}
      };

      System.out.println("The matrix is defined as: \n");
      for (int i = 0; i < matrix_size; i++) {
         for (int j = 0; j < matrix_size; j++) {
            System.out.print(input_matrix[i][j] + " ");
         }
         System.out.println();
      }
      transpose(input_matrix);
   }
}

코드 설명

  • transpose() 메서드가 전치 연산과 결과 출력을 담당합니다.
  • main 메서드에서는 입력 행렬을 정의하고 출력한 뒤, transpose(input_matrix)를 호출하기만 하면 됩니다.
  • 이처럼 기능별로 메서드를 분리하면 다른 크기의 행렬에도 손쉽게 확장할 수 있습니다.

실행 결과

The matrix is defined as:
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4

The transpose of the matrix is:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4

정리

행렬의 전치는 이중 반복문과 인덱스 교환([i][j] → [j][i])만으로 간단히 구현할 수 있습니다. 두 예제 모두 동일한 결과를 출력하지만, 예제 2처럼 로직을 메서드로 분리하면 코드 재사용성과 가독성이 크게 향상됩니다. 시간 복잡도는 O(n²)로, n×n 행렬의 모든 요소를 한 번씩 순회하는 것이 전체 연산의 핵심입니다.