이 글에서는 상삼각 행렬(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²)로, 행렬의 모든 요소를 한 번씩만 검사하면 되기 때문에 매우 효율적입니다.