본문 바로가기

코딩테스트 연습(with java)/프로그래머스

프로그래머스<행렬의 곱셈>

문제 설명

2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건
  • 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
  • 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
  • 곱할 수 있는 배열만 주어집니다.
입출력 예
arr1                                                    arr2                                                    return

 

[[1, 4], [3, 2], [4, 1]] [[3, 3], [3, 3]] [[15, 15], [15, 15], [15, 15]]
[[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]

 

행렬의 곱셈은 배열의 곱셈과 다르게 조건이 있다 

문제의 예시를 보며 정리하도록 하자

arr1 열(column)의 개수(2)와 arr2의 행(row)의 개수(2)가 같을 때 곱셈이 가능하다 

두 개를 곱한 행렬을 arr3라 했을 때, 

(1,1)의 성분은 arr1의 1행 성분과 arr2의 1열 성분을 다 곱해서 더한 값이 된다.

 

1 4
3 2
4 1

 

3 3
3 3

 arr1 1열 성분은 1,4

arr2의 행의 성분은 3, 3

1*3 + 4*3 식으로 정해지게 된다 

 

본 알고리즘을 기반으로 작성한 나의 코드) 

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        
        int row = arr1.length;
        int col = arr2[0].length;
        int arr2col = arr2.length;
        int[][] answer = new int[row][col];
        
        for(int i=0; i<row; i++){
            for(int j=0; j<col; j++){
                for(int a=0; a<arr2col; a++){
                    answer[i][j] = answer[i][j] + arr1[i][a]*arr2[a][j];
                }
            }
        }
        return answer;
    }
}
// arr1     arr2
// 1 4      3 3
// 3 2      3 3
// 4 1            
// int ROW	 = arr1.length;    // m1의 행 길이  > 3
// int COL	 = arr2[0].length; // m2의 열 길이 > 2 
// int M2_ROW = m2.length;    // m2의 행 길이 > 2

// int[][] m3 = new int[ROW][COL];
// for(int i = 0 ; i < ROW ; i++) {
//     for(int j = 0 ; j < COL ; j++) {
//         for(int k = 0 ; k < M2_ROW ; k++) {
//             m3[i][j] += m1[i][k] * m2[k][j];
//             [0][0] = 1*3 + 4*3 > 15
//             [0][1] = 1*3 + 4*3 > 15
//         }
//     }
// }

자주 사용할 것 같은 알고리즘이니 기억하도록 하자