Java

프로그래머스: 행렬의 곱셈

Daeryuk Kim 2024. 3. 7. 13:02
import java.util.*;

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int r1 = arr1.length;
        int c1 = arr1[0].length;
        int r2 = arr2.length;
        int c2 = arr2[0].length;
        
        if (c1 != r2) return null; 
        // 행렬 곱셈은 첫 번째 행렬의 열의 수와 
        // 두 번째 행렬의 행의 수가 같아야 함
        
        int[][] answer = new int[r1][c2];
        
        // 행렬1의 행의 개수(3)만큼 반복하되,
        // 결국 제일 많이 반복되는 건 행렬1의 열인 k이다.
        // 즉, 행렬2의 열의 수(2) * 행렬1의 열의 수(2)만큼 반복한다.
        
        /*          0  1    0  1 
         	0: [1, 4]  [3, 3]    ->j=0) 3 = 1(0,'0') * 3('0',0), 12 = 4(0,'1') * 3('1',0)  
                1: ...     [3, 3]      j=1) 3 = 1(0,'0') * 3('0',1), 12 = 4(0,'1') * 3('1',1)
        */
        for (int i = 0; i < r1; i++) {//행렬1의 행 개수 (ㅡ)
            for (int j = 0; j < c2; j++) { //행렬2의 열 개수 (|)
                for (int k = 0; k < c1; k++) { //"행렬1"의 열 개수 (|)
                    answer[i][j] += arr1[i][k] * arr2[k][j];
                }
            }
        }
        
        return answer;
    }
    
    public static void main(String[] args) {
        int[][] arr1 = {
            {1,4},
            {3,2},
            {4,1}
        };
        int[][] arr2 = {
            {3,3},
            {3,3},
        };
        
        Solution sol = new Solution();
        int[][] result = sol.solution(arr1, arr2);
        for(int i=0; i<result.length; i++){
            for(int j=0; j<result[i].length; j++){
                System.out.print(result[i][j] + " ");
            }
            System.out.println();
        }
    }
}