이 글에서는 다차원 배열(2차원 배열)을 사용하여 두 개의 행렬을 곱하는 방법을 알아보겠습니다. 행렬은 요소들이 행(row)과 열(column) 형태로 배열된 구조를 가지며, m개의 행과 n개의 열로 이루어진 행렬을 m × n 행렬이라고 부릅니다.
행렬의 각 요소는 a[i][j]와 같이 표현할 수 있으며, 이는 요소 a가 i번째 행, j번째 열에 위치한다는 의미입니다.
아래는 실제 동작 예시입니다.
입력 예시
첫 번째 행렬: 2 3 4 5 2 3 4 6 9 두 번째 행렬: 1 5 3 5 6 3 8 1 5
출력 결과
두 행렬의 곱은: 49 32 35 39 40 36 106 65 75
알고리즘
1단계 - 시작(START) 2단계 - 세 개의 정수형 행렬 선언: input_matrix_1, input_matrix_2, resultant_matrix 3단계 - 값 정의 4단계 - for 반복문으로 두 행렬의 모든 요소를 순회하면서, 첫 번째 행렬의 [i][j] 위치 요소와 두 번째 행렬의 해당 행의 각 요소를 곱한 후 더하여 그 값을 결과 행렬의 [i][j] 위치에 저장합니다. 첫 번째 행렬의 모든 요소에 대해 반복합니다. 5단계 - 결과 출력 6단계 - 종료(STOP)
예제 1: main 함수 안에서 모든 연산 처리
첫 번째 예제에서는 모든 연산을 'main' 함수 하나 안에 묶어서 처리합니다.
public class MultiplyMatrices {
public static void main(String[] args) {
int matrix_size = 3;
int[][] input_matrix_1 = {
{2, 3, 4},
{5, 2, 3},
{4, 6, 9}
};
System.out.println("The first matrix is defined as: ");
for (int i = 0; i < matrix_size; i++) {
for (int j = 0; j < matrix_size; j++) {
System.out.print(input_matrix_1[i][j] + " ");
}
System.out.println();
}
int[][] input_matrix_2 = {
{1, 5, 3},
{5, 6, 3},
{8, 1, 5}
};
System.out.println("The second matrix is defined as: ");
for (int i = 0; i < matrix_size; i++) {
for (int j = 0; j < matrix_size; j++) {
System.out.print(input_matrix_2[i][j] + " ");
}
System.out.println();
}
int[][] resultant_matrix = new int[matrix_size][matrix_size];
for(int i = 0; i < matrix_size; i++) {
for (int j = 0; j < matrix_size; j++) {
for (int k = 0; k < matrix_size; k++) {
resultant_matrix[i][j] += input_matrix_1[i][k] * input_matrix_2[k][j];
}
}
}
System.out.println("\n The product of two matrices is: ");
for(int[] row : resultant_matrix) {
for (int column : row) {
System.out.print(column + " ");
}
System.out.println();
}
}
}실행 결과
The first matrix is defined as: 2 3 4 5 2 3 4 6 9 The second matrix is defined as: 1 5 3 5 6 3 8 1 5 The product of two matrices is: 49 32 35 39 40 36 106 65 75
예제 2: 객체 지향 프로그래밍 방식 적용
두 번째 예제에서는 연산 로직을 별도의 함수로 분리하여 객체 지향 프로그래밍(OOP) 스타일로 구현합니다. 코드의 재사용성과 가독성이 향상됩니다.
public class MultiplyMatrices {
static int matrix_size = 3;
static void multiply(int input_matrix_1[][], int input_matrix_2[][]){
int[][] resultant_matrix = new int[matrix_size][matrix_size];
for(int i = 0; i < matrix_size; i++) {
for (int j = 0; j < matrix_size; j++) {
for (int k = 0; k < matrix_size; k++) {
resultant_matrix[i][j] += input_matrix_1[i][k] * input_matrix_2[k][j];
}
}
}
System.out.println("\n The product of two matrices is: ");
for(int[] row : resultant_matrix) {
for (int column : row) {
System.out.print(column + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
int matrix_size = 3;
int[][] input_matrix_1 = {
{2, 3, 4},
{5, 2, 3},
{4, 6, 9}
};
System.out.println("The first matrix is defined as: ");
for (int i = 0; i < matrix_size; i++) {
for (int j = 0; j < matrix_size; j++) {
System.out.print(input_matrix_1[i][j] + " ");
}
System.out.println();
}
int[][] input_matrix_2 = { {1, 5, 3},
{5, 6, 3},
{8, 1, 5}
};
System.out.println("The second matrix is defined as: ");
for (int i = 0; i < matrix_size; i++) {
for (int j = 0; j < matrix_size; j++) {
System.out.print(input_matrix_2[i][j] + " ");
}
System.out.println();
}
multiply(input_matrix_1, input_matrix_2);
}
}실행 결과
The first matrix is defined as: 2 3 4 5 2 3 4 6 9 The second matrix is defined as: 1 5 3 5 6 3 8 1 5 The product of two matrices is: 49 32 35 39 40 36 106 65 75
핵심 포인트 정리
행렬 곱셈의 핵심은 삼중 for 반복문입니다. 바깥쪽 두 반복문(i, j)은 결과 행렬의 위치를 결정하고, 가장 안쪽 반복문(k)은 첫 번째 행렬의 i번째 행과 두 번째 행렬의 j번째 열에 있는 요소들을 차례대로 곱하여 누적합을 계산합니다. 즉, resultant_matrix[i][j] = Σ input_matrix_1[i][k] × input_matrix_2[k][j] 공식을 코드로 구현한 것입니다.
또한 주의할 점은 행렬 곱셈이 성립하려면 첫 번째 행렬의 열 수와 두 번째 행렬의 행 수가 일치해야 한다는 것입니다. 위 예제에서는 두 행렬이 모두 3×3 크기이므로 문제없이 곱셈이 가능합니다.