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

다차원 배열을 활용해 두 행렬의 합을 구하는 Java 프로그램

이 글에서는 다차원 배열(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

알고리즘

두 행렬의 합을 구하는 전체 절차는 다음과 같습니다.

  1. START — 프로그램을 시작합니다.
  2. 정수형 행렬 세 개(input_matrix_1, input_matrix_2, resultant_matrix)를 선언합니다.
  3. 각 행렬에 저장할 값들을 정의합니다.
  4. for 반복문을 사용해 두 행렬의 모든 원소를 순회하면서, 첫 번째 행렬의 [i][j] 위치 원소와 두 번째 행렬의 [i][j] 위치 원소를 더한 값을 결과 행렬(resultant_matrix)의 [i][j] 위치에 저장합니다.
  5. 결과 행렬을 화면에 출력합니다.
  6. 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처럼 기능을 메서드로 분리하면 코드 재사용성과 가독성이 크게 향상되므로, 실무에서는 후자의 객체 지향 스타일을 권장합니다.