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

자바(Java)로 상삼각 행렬(Upper Triangular Matrix) 출력하는 방법

이 글에서는 상삼각 행렬(upper triangular matrix)을 화면에 표시하는 방법을 자바 코드와 함께 알아보겠습니다.

행렬(matrix)은 요소들이 행(row)과 열(column)의 형태로 배열된 수학적 구조입니다. m개의 행과 n개의 열로 구성된 행렬은 m × n 행렬이라고 부릅니다. 그중 상삼각 행렬이란 주 대각선(main diagonal) 아래에 위치한 모든 요소가 0으로 채워진 삼각 행렬을 의미합니다.

아래는 그 동작 과정을 보여주는 예시입니다.

입력 예시

정의된 행렬:
2 1 4
1 2 3
3 6 2

출력 결과

상삼각 행렬:
2 1 4
0 2 3
0 0 2

원본 행렬에서 대각선 왼쪽 아래에 있던 값들(1행의 첫 번째 요소 제외)이 0으로 바뀐 것을 확인할 수 있습니다.

알고리즘

Step 1 - 시작한다
Step 2 - 정수형 행렬 input_matrix를 선언한다
Step 3 - 행렬의 값을 정의한다
Step 4 - 두 개의 for 반복문을 사용해 행렬의 모든 요소를 순회하며,
         i > j 조건(대각선 아래 영역)에 해당하는 [i][j] 위치의 값에 0을 할당한다
Step 5 - 변환된 행렬을 결과로 출력한다
Step 6 - 종료한다

예제 1: main 함수 하나로 구현하기

첫 번째 방식은 모든 연산을 main 함수 안에 직접 작성하는 절차적(procedural) 스타일입니다.

public class UpperTriangle {
    public static void upper_triangular_matrix(int input_matrix[][]) {
    }
    public static void main(String[] args) {
        int input_matrix[][] = {
            { 2, 1, 4 },
            { 1, 2, 3 },
            { 3, 6, 2 }
        };
        int rows = input_matrix.length;
        int column = input_matrix[0].length;
        System.out.println("The matrix is defined as: ");
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < column; j++) {
                System.out.print(input_matrix[i][j] + " ");
            }
            System.out.println();
        }
        if (rows != column) {
            return;
        } else {
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < column; j++) {
                    if (i > j) {
                        input_matrix[i][j] = 0;
                    }
                }
            }
            System.out.println("\nThe upper triangular matrix is: ");
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < column; j++) {
                    System.out.print(input_matrix[i][j] + " ");
                }
                System.out.println();
            }
        }
    }
}

실행 결과

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

The upper triangular matrix is:
2 1 4
0 2 3
0 0 2

예제 2: 객체 지향 방식으로 함수 분리하기

두 번째 방식은 변환 로직을 별도의 함수로 캡슐화하여 객체 지향 프로그래밍(OOP) 원칙에 맞게 구현한 것입니다. 코드의 재사용성과 가독성이 더 좋아집니다.

public class UpperTriangle {
    public static void upper_triangular_matrix(int input_matrix[][]) {
        int rows = input_matrix.length;
        int column = input_matrix[0].length;
        if (rows != column) {
            return;
        } else {
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < column; j++) {
                    if (i > j) {
                        input_matrix[i][j] = 0;
                    }
                }
            }
            System.out.println("\nThe upper triangular matrix is: ");
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < column; j++) {
                    System.out.print(input_matrix[i][j] + " ");
                }
                System.out.println();
            }
        }
    }
    public static void main(String[] args) {
        int input_matrix[][] = {
            { 2, 1, 4 },
            { 1, 2, 3 },
            { 3, 6, 2 }
        };
        int rows = input_matrix.length;
        int column = input_matrix[0].length;
        System.out.println("The matrix is defined as: ");
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < column; j++) {
                System.out.print(input_matrix[i][j] + " ");
            }
            System.out.println();
        }
        upper_triangular_matrix(input_matrix);
    }
}

실행 결과

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

The upper triangular matrix is:
2 1 4
0 2 3
0 0 2

핵심 포인트 정리

이 알고리즘의 핵심은 조건문 i > j입니다. 행 인덱스(i)가 열 인덱스(j)보다 큰 위치, 즉 주 대각선 아래 영역의 요소만 골라 0으로 바꾸면 됩니다.

또한 행과 열의 개수가 다른 비정방 행렬에는 상삼각 행렬 개념이 적용되지 않으므로, rows != column 조건으로 정방 행렬(square matrix)인지 먼저 검사하고 처리하는 것이 안전합니다. 시간 복잡도는 O(n²)로, 행렬의 모든 요소를 한 번씩만 검사하면 되기 때문에 매우 효율적입니다.