프로그래머스의 행렬의 곱셈(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 |
'[ Programmers Code ] > # PG - Level2' 카테고리의 다른 글
[ 프로그래머스 K진수에서 소수 개수 구하기(Lv2) ] (C++) (0) | 2022.03.09 |
---|---|
[ 프로그래머스 N개의 최소공배수 (Lv2) ] (C++) (0) | 2021.09.03 |
[ 프로그래머스 스킬트리 (Lv2) ] (C++) (0) | 2021.08.24 |
[ 프로그래머스 점프와 순간이동 (Lv2) ] (C++) (0) | 2021.08.19 |
[ 프로그래머스 영어 끝말잇기 (Lv2) ] (C++) (0) | 2021.08.18 |