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

Java로 행렬의 대각선 요소를 교환하는 방법

이 글에서는 행렬의 대각선 요소를 서로 교환(interchange)하는 방법을 단계별로 살펴보겠습니다. 행렬은 요소들이 행(row)과 열(column) 형태로 배치된 2차원 배열 구조이며, m개의 행과 n개의 열로 구성된 행렬을 m × n 행렬이라고 부릅니다.

행렬을 이루는 개별 항목을 '요소(element)'라고 하며, a[i][j] 형태로 표현합니다. 이 표기는 i번째 행, j번째 열에 위치한 요소 a를 의미합니다.

아래는 실제 실행 결과 예시입니다.

입력값

정의된 행렬:
4 5 6
1 2 3
7 8 9

기대 출력 결과

대각선 요소 교환 후의 행렬:
6 5 4
1 2 3
9 8 7

알고리즘

STEP 1 - 시작
STEP 2 - 정수형 행렬 input_matrix와 정수형 변수 matrix_size, temp를 선언한다.
STEP 3 - 행렬의 초기값을 정의한다.
STEP 4 - 중첩 for 루프로 행렬의 각 요소를 순회하면서, 임시 변수 temp를 이용해 주대각선 요소와 반대대각선 요소를 교환한다.
STEP 5 - 결과를 출력한다.
STEP 6 - 종료

교환 원리

n × n 정방 행렬에서 주대각선 요소는 a[i][i]에, 반대대각선(부대각선) 요소는 a[i][n−i−1]에 위치합니다. 따라서 각 행마다 이 두 요소를 임시 변수를 사용해 맞바꾸면 됩니다. 단, 행렬 크기가 홀수일 경우 가운데 행(i == n/2)에서는 두 대각선 요소가 같은 위치이므로 교환하지 않습니다.

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

아래 예제는 모든 연산을 하나의 'main' 메서드 안에서 처리하는 절차적 방식입니다.

public class InterchangeDiagonals {
   public static int matrix_size = 3;
   public static void main (String[] args) {
      int input_matrix[][] = {
         {4, 5, 6},
         {1, 2, 3},
         {7, 8, 9}
      };
      System.out.println("정의된 행렬: ");
      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();
      }
      for (int i = 0; i < matrix_size; ++i)
         if (i != matrix_size / 2) {
            int temp = input_matrix[i][i];
            input_matrix[i][i] = input_matrix[i][matrix_size - i - 1];
            input_matrix[i][matrix_size - i - 1] = temp;
         }
         System.out.println("\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();
         }
      }
}

출력 결과

정의된 행렬:
4 5 6
1 2 3
7 8 9

대각선 요소 교환 후의 행렬:
6 5 4
1 2 3
9 8 7

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

아래 예제는 대각선 교환 로직을 별도의 메서드로 분리하여 객체지향 프로그래밍(OOP) 스타일로 작성한 것입니다.

public class InterchangeDiagonals {
   public static int matrix_size = 3;
   static void interchange_diagonals(int input_matrix[][]) {
      for (int i = 0; i < matrix_size; ++i)
      if (i != matrix_size / 2) {
         int temp = input_matrix[i][i];
         input_matrix[i][i] = input_matrix[i][matrix_size - i - 1];
         input_matrix[i][matrix_size - i - 1] = temp;
      }
      System.out.println("\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();
      }
   }
   public static void main (String[] args) {
      int input_matrix[][] = {
         {4, 5, 6},
         {1, 2, 3},
         {7, 8, 9}
      };
      System.out.println("정의된 행렬: ");
      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();
      }
      interchange_diagonals(input_matrix);
   }
}

출력 결과

정의된 행렬:
4 5 6
1 2 3
7 8 9

대각선 요소 교환 후의 행렬:
6 5 4
1 2 3
9 8 7

두 예제 모두 전체 수행 시간은 행렬 출력에 지배되지만, 실제 대각선 교환 연산 자체는 O(n)으로 매우 효율적입니다. 코드 재사용성과 유지보수 측면에서는 로직을 별도 메서드로 분리한 예제 2의 방식이 더 권장됩니다.