이 글에서는 다차원 배열(multi-dimensional array)을 활용하여 두 행렬(matrix)의 합을 구하는 방법을 살펴보겠습니다. 행렬은 원소들이 행(row)과 열(column) 형태로 배치된 2차원 구조를 가지며, m개의 행과 n개의 열을 갖는 행렬은 m × n 행렬이라고 부릅니다. 행렬의 개별 항목은 '원소(element)'라고 하며, a[i][j]처럼 표기할 수 있는데, 이는 행렬 a에서 i번째 행, j번째 열에 해당하는 값을 의미합니다. 참고로 두 행렬의 덧셈은 두 행렬의 크기가 서로 같을 때만 정의된다는 점도 함께 기억해 두면 좋습니다.
먼저 아래 예시를 통해 실제 입출력 과정을 확인해 보겠습니다.
입력 예시
첫 번째 행렬: 2 3 4 5 2 3 4 6 9 두 번째 행렬: 1 5 3 5 6 3 8 1 5
출력 예시
두 행렬의 합: 3 8 7 10 8 6 12 7 14
알고리즘
두 행렬의 합을 구하는 전체 절차는 다음과 같습니다.
- START — 프로그램을 시작합니다.
- 정수형 행렬 세 개(input_matrix_1, input_matrix_2, resultant_matrix)를 선언합니다.
- 각 행렬에 저장할 값들을 정의합니다.
- for 반복문을 사용해 두 행렬의 모든 원소를 순회하면서, 첫 번째 행렬의 [i][j] 위치 원소와 두 번째 행렬의 [i][j] 위치 원소를 더한 값을 결과 행렬(resultant_matrix)의 [i][j] 위치에 저장합니다.
- 결과 행렬을 화면에 출력합니다.
- STOP — 프로그램을 종료합니다.
예제 1: main 함수 하나로 처리하기
이번 예제에서는 행렬 선언, 덧셈 연산, 결과 출력까지 모든 과정을 하나의 main 함수 안에서 처리합니다. 코드가 비교적 단순해서 초보자에게 적합한 방식입니다.
public class AddMatrices {
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("첫 번째 행렬: \n");
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("두 번째 행렬: \n");
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++) {
resultant_matrix[i][j] = input_matrix_1[i][j] + input_matrix_2[i][j];
}
}
System.out.println("두 행렬의 합: ");
for (int[] row : resultant_matrix) {
for (int column : row) {
System.out.print(column + " ");
}
System.out.println();
}
}
}
실행 결과
첫 번째 행렬: 2 3 4 5 2 3 4 6 9 두 번째 행렬: 1 5 3 5 6 3 8 1 5 두 행렬의 합: 3 8 7 10 8 6 12 7 14
예제 2: 객체 지향 방식으로 캡슐화하기
이번에는 덧셈 로직을 별도의 메서드(add)로 분리해 객체 지향 프로그래밍(OOP) 스타일로 재구성했습니다. 코드를 함수 단위로 나누면 재사용성과 유지보수성이 높아진다는 장점이 있습니다.
public class AddMatrices {
static int matrix_size = 3;
static void add(int input_matrix_1[][], int input_matrix_2[][]) {
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++) {
resultant_matrix[i][j] = input_matrix_1[i][j] + input_matrix_2[i][j];
}
}
System.out.println("\n두 행렬의 합: ");
for (int[] row : resultant_matrix) {
for (int column : row) {
System.out.print(column + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
int[][] input_matrix_1 = {
{2, 3, 4},
{5, 2, 3},
{4, 6, 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_1[i][j] + " ");
}
System.out.println();
}
int[][] input_matrix_2 = {
{1, 5, 3},
{5, 6, 3},
{8, 1, 5}
};
System.out.println("\n두 번째 행렬: ");
add(input_matrix_1, input_matrix_2);
}
}
실행 결과
첫 번째 행렬: 2 3 4 5 2 3 4 6 9 두 번째 행렬: 1 5 3 5 6 3 8 1 5 두 행렬의 합: 3 8 7 10 8 6 12 7 14
정리
두 행렬의 덧셈은 같은 위치의 원소끼리 더하는 단순한 연산이므로, 중첩 for 반복문만 활용하면 손쉽게 구현할 수 있습니다. 시간 복잡도는 행렬의 크기가 m × n일 때 O(m × n)이 됩니다. 예제 1처럼 main 함수에 로직을 모으는 방식은 간단하지만, 예제 2처럼 기능을 메서드로 분리하면 코드 재사용성과 가독성이 크게 향상되므로, 실무에서는 후자의 객체 지향 스타일을 권장합니다.