쌓고 쌓다
[프로그래머스] 행렬의 곱셈 C++ 풀이 본문
https://school.programmers.co.kr/learn/courses/30/lessons/12949#qna
전체 코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
vector<vector<int>> answer;
for(int i=0;i<arr1.size();i++) // i행
{
vector<int> v;
for(int j=0;j<arr2[0].size();j++) // j열
{
int s=0;
for(int k=0;k<arr2.size();k++)
{
s+=arr1[i][k]*arr2[k][j];
}
v.push_back(s);
}
answer.push_back(v);
}
return answer;
}
풀이 방법
행렬의 곱셈에 대해 공부하면 풀 수 있는 문제입니다.
아래의 이미지는 이해하기 좋아서 출처를 밝히고 가져왔습니다...
행렬의 곱셈에서 k는 동일합니다.
행렬 ( m * k )와 행렬 ( k * n )의 곱셈으로 만들어지는 결과 행렬은 ( m * n )입니다.
결과 행렬 (i,j)의 성분은 행렬 A의 i행과 행렬 B의 j열의 곱입니다.
이때 A행렬의 i행 0열에서 i행 k열까지, B행렬의 j열 0행에서 k행까지 곱을 더하는 방식으로 구현합니다.
아래의 코드를 보면
for(int k=0;k<arr2.size();k++)
{
s+=arr1[i][k]*arr2[k][j];
}
A행렬에서는 행은 i로 고정이고 열만 0~k까지 이동하며
B행렬에서는 열은 j로 고정되어있고 행만 0~k까지 이동하며 서로 곱한 결과가
결과 행렬의 (i,j) 성분 값입니다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 프린터 C++ 풀이 (0) | 2022.12.23 |
---|---|
[프로그래머스] 위장 C++ 풀이 (1) | 2022.12.21 |
[프로그래머스] 괄호 회전하기 C++ 풀이 (0) | 2022.11.19 |
[프로그래머스] H-Index C++ 풀이 (0) | 2022.11.02 |
[프로그래머스] 점프와 순간 이동 (0) | 2022.10.15 |
Comments