본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

[c++] 백준 2740 행렬 곱셉

백준 단계별로 풀어보기 [분할 정복] 행렬 곱셈

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가 주어졌을 때, 두 행렬을 곱하는 프로그램. O(n^3)의 시간복잡도.

 

[코드]

#include <iostream>
#include <string>
#include <algorithm>

int mat_a[100][100];
int mat_b[100][100];
int mat_c[100][100];

int main() {
	//n*m의 행렬 a와 m*k의 행렬 b가 주어졌을 때, 두 행렬을 곱하는 프로그램.
	int n, m, k;

	std::cin >> n >> m;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			std::cin >> mat_a[i][j];
		}
	}

	std::cin >> m >> k;
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < k; j++) {
			std::cin >> mat_b[i][j];
		}
	}

	for (int i = 0; i < n; i++) {
		for (int l = 0; l < k; l++) {
			for (int j = 0; j < m; j++) {
				mat_c[i][l] += mat_a[i][j] * mat_b[j][l];
			}
		}
	}

	for (int i = 0; i < n; i++) {
		for (int l = 0; l < k; l++) {
			std::cout << mat_c[i][l] << " ";
		}
		std::cout << "\n";
	}
}