티스토리 뷰

#include <string>
#include <vector>

using namespace std;

// arr1(m * k 행렬) * arr2(k * n 행렬) = answer (m * n 행렬)
vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2) {
    vector<vector<int>> answer;
    vector<int> answer_temp;
    
    int m, n, k;
    int temp = 0;
    
    for(m = 0; m < arr1.size(); m++){
        for(n = 0; n < arr2[0].size(); n++){
            temp = 0;
            for( k = 0; k < arr2.size(); k++){
                temp += arr1[m][k] * arr2[k][n];
            }
            answer_temp.push_back(temp);
        }
        answer.push_back(answer_temp);
        answer_temp.clear();
    }
    
    return answer;
}

 

 

 

 

행렬의 곱셈 공식을 알고도, m, n 그리고 겹치는 k를 어떻게 for문으로 구성하는지가 헷갈렸다.

연습장에 충분히 연습해보고 구성했다.

 

answer 하나의 행에 대한 원소들의 값을 answer_temp에 push 해놓고, 끝나면 answer에 push한다.

그리고 clear 함수를 이용해서 answer_temp를 비워준다.

이렇게 계속 반복하면서 answer 배열에 한 행씩 채워나간다.

 

이건 설명을 쓰기엔 너무 공식뿐이어서 직접 연습장에 행렬의 곱셈을 풀어보면서 내가 어떤 방식으로 풀고 있는지 그리고 그것을 어떻게 for문으로 묶을 수 있는지 생각해보면 좋다.

처음엔 풀고도 for문이 3개나 있는데 시간초과 나겠네... 생각했는데 올 패스가 떠서 놀랬당

아마 배열의 크기가 커지면 어마무시해지겠지 

댓글