이 글에서는 주어진 행렬의 대각합(Trace)과 노름(Normal)을 구하는 방법을 알아봅니다. 행렬의 노름은 행렬에 포함된 모든 원소를 제곱하여 더한 뒤, 그 값의 제곱근을 취한 것을 의미하며, 대각합(트레이스)은 행렬의 주대각선(왼쪽 위에서 오른쪽 아래 방향)에 위치한 모든 원소들의 합을 말합니다.
두 값의 계산 과정은 아래 예시와 같습니다.
입력 및 출력 예시
입력값
정의된 행렬: 2 3 4 5 2 3 4 6 9
기대되는 출력값
대각합(Trace): 13.0 노름(Normal): 14.142135623730951
알고리즘
1단계 - 시작(START) 2단계 - 정수형 행렬 input_matrix 선언 3단계 - 행렬의 값을 정의한다. 4단계 - 대각합 계산: 두 개의 for 루프를 사용해 행렬의 각 원소를 순회하면서 대각선 원소들을 더한 값을 저장한다. 5단계 - 노름 계산: 두 개의 for 루프를 사용해 각 원소의 제곱합을 구한 뒤, 그 값의 제곱근을 계산하여 저장한다. 6단계 - 결과를 화면에 출력한다. 7단계 - 종료(STOP)
예제 1: main 함수에서 모든 연산 처리하기
아래 예제는 모든 연산을 하나의 'main' 함수 안에서 함께 수행하는 방식입니다.
public class NormalAndTrace {
public static void main(String args[]) {
int[][] input_matrix = {
{2, 3, 4},
{5, 2, 3},
{4, 6, 9}
};
int i, j, matrix_size = 3;
double trace = 0, square = 0, normal = 0;
System.out.println("정의된 행렬은 다음과 같습니다: ");
for(i = 0; i < matrix_size; i++) {
for(j = 0; j < matrix_size; j++)
System.out.print(input_matrix[i][j]+" ");
System.out.println(" ");
}
System.out.println("\n행렬의 대각합(Trace)은 다음과 같습니다: ");
for(i = 0; i < matrix_size; i++) {
for(j = 0; j < matrix_size; j++) {
if(i == j) {
trace = trace + (input_matrix[i][j]);
}
}
}
System.out.println(trace);
System.out.println("\n행렬의 노름(Normal)은 다음과 같습니다: ");
for(i = 0; i < matrix_size; i++) {
for(j = 0; j < matrix_size; j++) {
square = square + (input_matrix[i][j])*(input_matrix[i][j]);
}
}
normal = Math.sqrt(square);
System.out.println(normal);
}
}
실행 결과
정의된 행렬은 다음과 같습니다: 2 3 4 5 2 3 4 6 9 행렬의 대각합(Trace)은 다음과 같습니다: 13.0 행렬의 노름(Normal)은 다음과 같습니다: 14.142135623730951
예제 2: 객체지향 방식으로 함수 분리하기
이번에는 대각합과 노름을 계산하는 연산 부분을 별도의 함수로 캡슐화하여, 객체지향 프로그래밍(OOP) 스타일에 맞게 작성합니다.
public class NormalAndTrace {
static int matrix_size = 3;
static void normal_trace(int input_matrix[][]){
int i, j;
double trace = 0, square = 0, normal = 0;
System.out.println("\n행렬의 대각합(Trace)은 다음과 같습니다: ");
for(i = 0; i < matrix_size; i++) {
for(j = 0; j < matrix_size; j++) {
if(i == j) {
trace = trace + (input_matrix[i][j]);
}
}
}
System.out.println(trace);
System.out.println("\n행렬의 노름(Normal)은 다음과 같습니다: ");
for(i = 0; i < matrix_size; i++) {
for(j = 0; j < matrix_size; j++) {
square = square + (input_matrix[i][j])*(input_matrix[i][j]);
}
}
normal = Math.sqrt(square);
System.out.println(normal);
}
public static void main(String args[]) {
int i, j;
int[][] input_matrix = { {2, 3, 4},
{5, 2, 3},
{4, 6, 9}
};
System.out.println("정의된 행렬은 다음과 같습니다: ");
for(i = 0; i < matrix_size; i++) {
for(j = 0; j < matrix_size; j++)
System.out.print(input_matrix[i][j]+" ");
System.out.println(" ");
}
normal_trace(input_matrix);
}
}
실행 결과
정의된 행렬은 다음과 같습니다: 2 3 4 5 2 3 4 6 9 행렬의 대각합(Trace)은 다음과 같습니다: 13.0 행렬의 노름(Normal)은 다음과 같습니다: 14.142135623730951
참고로, 두 예제 모두 행렬의 모든 원소를 한 번씩만 순회하므로 시간 복잡도는 O(n²)입니다. 따라서 n×n 크기의 행렬에서도 대각합과 노름을 효율적으로 계산할 수 있습니다.