본문 바로가기

자바 자료구조 알고리즘

행렬의 덧셈과 뺄셈 곱셈

행렬의 덧셈과 뺄셈

성사 조건

두 행렬의 행과 열의 개수가 같아야 한다.

자바의 2차원 배열

행 가로(행과) row

열 세로 column

int[][] arr = new int[2][3];
System.out.println(Arrays.deepToString(arr));
[[0, 0, 0], [0, 0, 0]]

int[][] arr2 = {{1, 2}, {1, 2}, {1, 2}}; //3행 2열
System.out.println(Arrays.deepToString(arr2));
[[1, 2], [1, 2], [1, 2]]

row 값으로 행렬의 덧셈 식

new int[4][5]가 주어졌을 때 어떤 모양이 되는 지 파악하는 것이 중요하다. 4행 5열

int[][] a = new int[2][3]

[[0, 0][0, 1][0, 2]] + [[0, 0][0, 1][0, 2]] 각 행끼리 더한 값을 모아서 결과를 낸다.

[[1, 0][1, 1][1, 2]] + [[1, 0][1, 1][1, 2]]

public static void main(String[] args) {
        int[][] a = {{1, 1, 1}, {1, 1, 1}};
        int[][] b = {{3, 3, 3}, {3, 3, 3}};

        int[][] result = new int[2][3];
        for (int i = 0; i < a.length; i++) {
            int[] row = new int[a[0].length];
            for (int j = 0; j < a[i].length; j++) {
                row[j] = a[i][j] + b[i][j];
            }
            result[i] = row;
        }
        System.out.println(Arrays.deepToString(result));
    }

행과 열의 개수로 구하는 식

public static void main(String[] args) {
        int[][] arr = new int[2][3];
        System.out.println(Arrays.deepToString(arr));
        int[][] a = {{1, 1, 1}, {1, 1, 1}};
        int[][] b = {{3, 3, 3}, {3, 3, 3}};

        int[][] result = new int[2][3];

        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                result[i][j] = a[i][j] + b[i][j];
            }
        }
        System.out.println(Arrays.deepToString(result));
    }

행렬의 곱셈

행렬의 곱이 성사 조건

2행2 열 행렬과 2행 2열 행렬 곱 모양 → 2행 2열 행렬 결과

2행3열 행렬과 3행2열 행렬 곱 모양 →2행 3열 행렬 결과

조건 : 첫 번째 행렬의 열과 두 번째 행렬의 행이 같아야 한다.

결과: 첫 번째 행렬의 행과 두 번째 행렬의 열을 가진다

만약 arr1이 3행2열이고 arr2가 2행 5열이면 결과 행렬은 3행 5열은 가지게 된다.

풀이

public static void main(String[] args) {
        int[][] arr1 = {{1, 2, 3}, {4, 5, 6}}; //2행 3열
        int[][] arr2 = {{1, 1}, {1, 1}, {1, 1}}; //3행 2열 -> 결과 2행 2열이 나온다.
        //결과 [[6,6][15,15]]

        int[][] result = new int[arr1.length][arr2[0].length];
        System.out.println(Arrays.deepToString(result));
        //arr1의 행과
        for(int i = 0 ; i < arr1.length ; ++i){
            //arr2의 열의 결과
            for(int j = 0 ; j < arr2[0].length ; ++j){
                for(int k = 0 ; k < arr1[0].length ; ++k) {
                    result[i][j] += arr1[i][k] * arr2[k][j];
                }
            }
        }
        System.out.println(Arrays.deepToString(result));
    }

arr1의 열k 와 arr2 행k의 곱의 합이 result[i][j] 의 값이 된다.


참고 자료

https://velog.io/@hyeon930/프로그래머스-행렬의-곱셈-Java

'자바 자료구조 알고리즘' 카테고리의 다른 글

자바 해시 테이블 자료구조  (0) 2023.01.15
자바의 스택과 큐  (0) 2023.01.07