프로그래머스의 행렬의 곱셈(Lv2) 문제이다.

 

[ 문제풀이 ]

주어지는 2개의 행렬의 곱셈 결과를 출력해야 하는 문제이다.

한 가지 예시를 가지고 진행해보자.

Arr1 = [ [ A , B ] , [ C , D ] , [ E , F ] ]

Arr2 = [ [ a , b ] , [ c , d] ]

위와 같은 2개의 행렬이 있다.

행렬의 크기가 A x B 인 행렬과, B x C 인 행렬이 있을 때, 이 2개의 행렬의 곱으로 만들어진 행렬은 A x C 크기의 행렬이 된다.

위의 예시 같은 경우에는 Arr1 = 3 x 2 인 행렬이고 , Arr2 = 2 x 2 인 행렬이기 때문에 곱했을 때 3 x 2 크기의 행렬이 나오게 된다.

그럼 두 행렬의 곱으로 만들어지는 행렬을 다음과 같이 표현해보자. [ [ X ,  Y ] , [ U , V ] , [ K , L ] ]

A B     a b

C D x  c d

E F

이 때, X = (A * a) + (B * c) 가 된다.

Y = (A * b) + (B * d)

U = (C * a) + (D * c)

V = (C * c) + (D * d)

... 이런식으로 계산이 되어지게 된다.

 

이를 3중 for문을 통해서 나타낼 수 있다.

1. 첫 번째 for문 

- Arr1의 행을 나타내기 위한 for문이다.

  위에서도, X , Y를 계산하기 위해서는 Arr1의 0번째 행인 'A', 'B'가 사용되고, U , V를 계산하기 위해서는 Arr1의 1번 행

  인 'C', 'D'가 사용된다. 이를 나타내기 위한 for문이다.

2. 두 번째 for문

- Arr2의 열을 나타내기 위한 for문이다.

  X의 값을 계산할 떄에는, Arr2의 0번 열인 'a', 'c'가 사용되고, U , V를 계산하기 위해서는 Arr2의 1번 열인 'b'와 'd'가

  사용된다. 이를 나타내기 위한 for문이다.

3. 세 번째 for문

- 실제 계산을 위한 for문이다.

  Arr1의 열을 나타냄과 동시에 Arr2의 행을 나타내는 for문이다.

  첫 번째 for문에서는 Arr1의 행만을, 두 번째 for문에서는 Arr2의 열을 나타내 주었는데, 사실 계산을 하기 위해서는

  (행 , 열) 을 알고 있어야 한다. 즉 ! 세 번째 for문이 Arr1의 열을, Arr2의 행을 나타내는 역할이고 실제로 계산을 하기

  위해 사용되는 for문이다.

 

 

[ 소스코드 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <string>
#include <vector>
 
using namespace std;
 
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) 
{
    vector<vector<int>> answer;
    int Row = arr1.size();
    int Col = arr1[0].size();
    int Row2 = arr2.size();
    int Col2 = arr2[0].size();
    
    for(int i = 0 ; i < Row ; i++)
    {
        vector<int> V;
        for(int j = 0 ; j < Col2 ; j++)
        {
            int Sum = 0;
            for(int k = 0 ; k < Row2; k++)
            {
                Sum += arr1[i][k] * arr2[k][j];
            }
            V.push_back(Sum);
        }
        answer.push_back(V);
    }
    return answer;
}
cs

 

 

+ Recent posts