3 분 소요

실습 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 } } );
}

댓글남기기