2023-04-20 행렬의 곱셈

해결한 방법

  1. 행렬의 곱셈

[이미지 출처] (https://mathbang.net/562#gsc.tab=0)

img_15

1
2
3
[[1, 4],     [[3, 3],
[3, 2],      [3, 3]]
[4, 1]]

예를 들어 위의 예제에서, 첫번째 행렬을 A, 두번째 행렬을 B 라고 할 때 A 의 1번째 행과 B 의 1번째 열을 곱한 값은 1 * 3 + 4 * 3 = 15 임을 확인할 수 있다.

  1. 이러한 행렬의 곱셈을 중첩 for loop 으로 표현할 수 있다. 첫번째 for loop 은 A 행렬의 행 방향 (세로), 두번째 for loop 은 B 행렬의 열 방향 (가로), 세번째 for loop 은 “곱셈” 을 나타내기 위한 len(A[0]) 을 iterate 한다고 생각하고 코드를 작성하였다.

즉, 첫번째와 두번째 for loop 은 A 행렬과 B 행렬의 행과 열을 짝지어가는 부분이라고 보고 세번째 for loop 은 이렇게 짝지어진 행과 열에 대해 곱셈을 수행해야 하는데 곱해서 더할 원소들의 갯수는 len(A[0]) 과 동일하므로 len(A[0]) 에 대해서 순회하도록 짠 것이다.

전체 코드

Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] ans = new int[arr1.length][arr2[0].length];
        
        for (int i=0; i<arr1.length; i++) {
            for (int j=0; j<arr2[0].length; j++) {
                int sum = 0;
                for (int k=0; k<arr1[0].length; k++) {
                    sum += (arr1[i][k] * arr2[k][j]);
                }
                ans[i][j] = sum;
            }
        }
        return ans;
    }
}

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def solution(arr1, arr2):
    """
    [[1, 4],     [[3, 3],
     [3, 2],      [3, 3]]
     [4, 1]]     
     
    [[2, 3, 2],    [[5, 4, 3],
     [4, 2, 4],     [2, 4, 1], 
     [3, 1, 4]]     [3, 1, 1]]          
    """
    
    ans = [[] for _ in range(len(arr1))]
    for i in range(len(arr1)):
        for j in range(len(arr2[0])):
            ans[i].append(sum([arr1[i][k] * arr2[k][j] for k in range(len(arr1[0]))]))
            
    return ans

comments powered by Disqus