쌓고 쌓다

[프로그래머스] 행렬의 곱셈 C++ 풀이 본문

알고리즘/프로그래머스

[프로그래머스] 행렬의 곱셈 C++ 풀이

승민아 2022. 11. 20. 00:34

https://school.programmers.co.kr/learn/courses/30/lessons/12949#qna

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

전체 코드

#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;
}

 

풀이 방법

행렬의 곱셈에 대해 공부하면 풀 수 있는 문제입니다.

 

아래의 이미지는 이해하기 좋아서 출처를 밝히고 가져왔습니다...

출처 :https://mathbang.net/562

행렬의 곱셈에서 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) 성분 값입니다.

 

Comments