본문 바로가기
⌨️CS-PS/백준_수학&구현

[Baekjoon/백준][2740][C/C++] 행렬 곱셈

by 미르의 블로그 2023. 5. 5.
728x90
반응형
『목차』
0. 개요

1. 문제
2. 풀이
3. 코드

0. 개요

수학, 구현, 선형대수학 문제. 행렬곱의 원리에 대해 알고있어야만 풀 수 있는 문제이다.

1. 문제

https://www.acmicpc.net/problem/2740

 

2740번: 행렬 곱셈

첫째 줄에 행렬 A의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 순서대로 주어진다. 그 다음 줄에는 행렬 B의 크기 M과 K가 주어진다. 이어서 M개의 줄에 행렬 B의 원소 K개

www.acmicpc.net

[문제]

N*M크기의 행렬 A와 M*K크기의 행렬 B가 주어졌을 때, 두 행렬을 곱하는 프로그램을 작성하시오.

[입력]

첫째 줄에 행렬 A의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 순서대로 주어진다. 그 다음 줄에는 행렬 B의 크기 M과 K가 주어진다. 이어서 M개의 줄에 행렬 B의 원소 K개가 차례대로 주어진다. N과 M, 그리고 K는 100보다 작거나 같고, 행렬의 원소는 절댓값이 100보다 작거나 같은 정수이다.

[출력]

첫째 줄부터 N개의 줄에 행렬 A와 B를 곱한 행렬을 출력한다. 행렬의 각 원소는 공백으로 구분한다.

[예제 입력 1]

3 2
1 2
3 4
5 6
2 3
-1 -2 0
0 0 3

[예제 출력 1]

-1 -2 6
-3 -6 12
-5 -10 18
반응형

2. 풀이

[Baekjoon/백준][2740][C/C++] 행렬 곱셈
[Baekjoon/백준][2740][C/C++] 행렬 곱셈

행렬곱의 원리는 위와 같다. 3중 for문을 통해 NxM 행렬과 MxK 행렬의 연산을 진행할 수 있다.

3. 코드

#include <iostream>
using namespace std;

int mat1[100][100] = {};
int mat2[100][100] = {};

int main(int argc, char* argv[]) {
	/* Faster */
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	/* Init */
	int n, m, k;

	/* Mat1 */
	cin >> n >> m;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			cin >> mat1[i][j];

	/* Mat2 */
	cin >> m >> k;
	for (int i = 0; i < m; i++)
		for (int j = 0; j < k; j++)
			cin >> mat2[i][j];

	/* Output */
	for (int _n = 0; _n < n; _n++) {
		for (int _k = 0; _k < k; _k++) {
			int mul = 0;

			for (int _m = 0; _m < m; _m++)
				mul += mat1[_n][_m] * mat2[_m][_k];

			cout << mul << ' ';
		}
		cout << '\n';
	}
		
	/* Return */
	return 0;
}
728x90
반응형