알고리즘/프로그래머스

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

문제 : 행렬의 곱셈

문제 설명

 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]]

 

 분석

 행렬의 곱셈 과정을 그대로 적용해서 for문을 통해 계산하면 된다. 

행렬의 곱셈

인덱스 설정에만 주의하자.

 

 구현

using namespace std;

vector<vector<int>> solution(vector<vector<int>> arr1, vector<vector<int>> arr2)
{
	vector<vector<int>> answer;

	for (size_t i = 0; i < arr1.size(); i++)
	{
		vector<int> row;
		for (size_t j = 0; j < arr2[0].size(); j++)
		{
			int row_tmp = 0;
			for (size_t n = 0; n < arr1[i].size(); n++)
			{
				row_tmp += arr1[i][n] * arr2[n][j];
			}
			row.push_back(row_tmp);
		}
		answer.push_back(row);
	}

	return answer;
}

int main()
{
	vector<vector<int>> arr1 = { {1,4},{3,2},{4,1} };
	vector<vector<int>> arr2 = { {3,3},{3,3} };
	vector<vector<int>> ans = solution(arr1, arr2);
	
	/*
	15 15
	15 15
	15 15
	*/
	for (size_t i = 0; i < ans.size(); i++)
	{
		for (size_t j = 0; j < ans[0].size(); j++)
		{
			cout << ans[i][j] << ' ';
		}putchar('\n');
	}

	return 0;
}