14.1주차
실습 13
문제
행렬 곱 구하기(반드시 곱셈이 가능한 행렬의 형태만 주어진다.)
내가 제출한 코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
class P13
{
protected:
vector<vector<int>> arr1;
vector<vector<int>> arr2;
public:
P13(vector<vector<int>> arr1, vector<vector<int>> arr2);
vector<vector<int>> solve();
};
P13::P13(vector<vector<int>> arr1, vector<vector<int>> arr2)
{
this->arr1 = arr1;
this->arr2 = arr2;
}
vector<vector<int>> P13::solve()
{
vector<vector<int>> return_vec;
for (int row = 0; row < arr1.size(); row++)
{
int temp = 0;
vector<int> vec;
for (int k = 0; k < arr2[0].size(); k++)
{
for (int i = 0; i < arr1[row].size(); i++)
{
int temp2 = arr1[row][i] * arr2[i][k];
temp += temp2;
}
vec.push_back(temp);
temp = 0;
}
return_vec.push_back(vec);
}
// 행렬 출력을 위한 반복문
for (int i = 0; i < return_vec.size(); i++)
{
for (int j = 0; j < return_vec[i].size(); j++)
{
cout << return_vec[i][j] << " ";
}
cout << endl;
}
return return_vec;
}
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2)
{
vector<vector<int>> answer;
P13 p(arr1, arr2);
answer = p.solve();
return answer;
}
교수님 코드
교수님의 경우는 operator * 를 오퍼레이터 오버로딩을 통해서 코드를 작성하였다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
class TDArray
{
private:
vector<vector<int>> values;
int getInnerProduct(TDArray ar, int i, int j);
public:
TDArray(vector<vector<int>> values);
TDArray operator*(TDArray ar);
friend ostream &operator<<(ostream &os, TDArray ar);
};
TDArray::TDArray(vector<vector<int>> values)
{
this->values = values;
}
int TDArray::getInnerProduct(TDArray ar, int i, int j)
{
int sum = 0;
for (int k = 0; k < values[0].size(); k++)
{
sum += values[i][k] * ar.values[k][j];
}
return sum;
}
// ar: 오른쪽 행렬
TDArray TDArray::operator*(TDArray ar)
{
// 행렬곱 결과는 행은 this의 행, 열은 ar의 열
vector<vector<int>> v;
for (int i = 0; i < values.size(); i++)
{
vector<int> row;
for (int j = 0; j < ar.values[0].size(); j++)
{
// this의 멤버 함수이므로 나 자신은 전달하지 않아도 됨
row.push_back(getInnerProduct(ar, i, j));
}
v.push_back(row);
}
return TDArray(v);
}
ostream &operator<<(ostream &os, TDArray ar)
{
for (int i = 0; i < ar.values.size(); i++)
{
for (int j = 0; j < ar.values[0].size(); j++)
{
os << ar.values[i][j] << " ";
}
os << endl;
}
return os;
}
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2)
{
vector<vector<int>> answer;
cout << (TDArray(arr1) * TDArray(arr2)) << endl;
return answer;
}
근데 이렇게 코드를 작성해도 여전히 비효율이야 왜? 벡터의 경우는 데이터의 안정성이 보장된다면 const와 & 연산자를 이용해서 매개변수를 전달한다.
// ref가 더 효율적이다.
#include <string>
#include <vector>
#include <iostream>
using namespace std;
class TDArray
{
private:
vector<vector<int>> values;
int getInnerProduct(TDArray &ar, int i, int j);
public:
TDArray(vector<vector<int>> values);
TDArray operator*(TDArray &ar);
friend ostream &operator<<(ostream &os, TDArray &ar);
};
TDArray::TDArray(vector<vector<int>> values)
{
this->values = values;
}
int TDArray::getInnerProduct(TDArray &ar, int i, int j)
{
int sum = 0;
for (int k = 0; k < values[0].size(); k++)
{
sum += values[i][k] * ar.values[k][j];
}
return sum;
}
TDArray TDArray::operator*(TDArray &ar)
{
vector<vector<int>> v;
for (int i = 0; i < values.size(); i++)
{
vector<int> row;
for (int j = 0; j < ar.values[0].size(); j++)
{
row.push_back(getInnerProduct(ar, i, j));
}
v.push_back(row);
}
return TDArray(v);
}
ostream &operator<<(ostream &os, TDArray &ar)
{
for (int i = 0; i < ar.values.size(); i++)
{
for (int j = 0; j < ar.values[0].size(); j++)
{
os << ar.values[i][j] << " ";
}
os << endl;
}
return os;
}
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2)
{
vector<vector<int>> answer;
TDArray array1(arr1), array2(arr2);
TDArray result = (array1 * array2);
cout << result << endl;
return answer;
}
cout << (TDArray(arr1) * TDArray(arr2)) << endl;
: 에러가 떠? 왜냐면 바로 변수를 넣었기 때문에 변수 명이 없어서 일시적인 변수가 되버리기 때문이다. -> 얘를 해결하기 위해서는 위와 같이 할 수 있지만 위의 출력 코드를 유지하고 싶다면 const를 써가지고 임시 변수도 &가 가능하도록 하는 것이다.
main
int main()
{
solution( { { 1, 2, 3 }, { 4, 5, 6 } } , { { 1, 2 }, { 3, 4 }, { 5, 6 } } );
}
댓글남기기