[C++ Programming] 실습Part2 : 행렬의 곱셈
행렬의 곱셈
-
📝문제 설명
- 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]]
- ✏️풀이
#include<iostream>
#include<vector>
using namespace std;
class Matrix
{
public:
Matrix(vector<vector<int>> v);
Matrix operator*(Matrix& m);
friend ostream& operator<<(ostream& os, const Matrix& m);
private:
vector<vector<int>> values;
int getInnerProduct(Matrix& m, int i, int j);
protected:
};
Matrix::Matrix(vector<vector<int>> v)
{
values = v;
}
Matrix Matrix::operator*(Matrix& m)
{
vector<vector<int>> v;
for (int i = 0; i < values.size(); i++) {
vector<int> row;
for (int j = 0; j < m.values[0].size(); j++) {
row.push_back(getInnerProduct(m, i, j));
}
v.push_back(row);
}
return Matrix(v);
}
int Matrix::getInnerProduct(Matrix& m, int i, int j)
{
int sum = 0;
for (int k = 0; k < values[0].size(); k++) {
sum += values[i][k] * m.values[k][j];
}
return sum;
}
ostream& operator<<(ostream& os, const Matrix& m) {
for (int i = 0; i < m.values.size(); i++) {
for (int j = 0; j < m.values[0].size(); j++) {
os << m.values[i][j] << ' ';
}
os << endl;
}
return os;
}
int main(void) {
vector<vector<int>> v, w;
vector<int> row;
row.push_back(1);
row.push_back(2);
row.push_back(3);
v.push_back(row);
row.clear();
row.push_back(4);
row.push_back(5);
row.push_back(6);
v.push_back(row);
row.clear();
row.push_back(1);
row.push_back(2);
w.push_back(row);
row.clear();
row.push_back(3);
row.push_back(4);
w.push_back(row);
row.clear();
row.push_back(5);
row.push_back(6);
w.push_back(row);
row.clear();
Matrix arr1(v);
Matrix arr2(w);
Matrix res = arr1 * arr2;
cout << res << endl;
return 0;
}