PS (C, C++)

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

최연재 2023. 1. 29. 13:00

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

 

2740번: 행렬 곱셈

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

www.acmicpc.net

C

#include <stdio.h>

int main()
{
	int n, m, k, a[101][101], b[101][101], result[101][101] = { 0, };
	scanf("%d %d", &n, &m);
	for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) scanf("%d", &a[i][j]);
	scanf("%d %d", &m, &k);
	for (int i = 0; i < m; i++) for (int j = 0; j < k; j++) scanf("%d", &b[i][j]);

	for (int i = 0; i < n; i++) for (int j = 0; j < k; j++) for (int u = 0; u < m; u++) result[i][j] += a[i][u] * b[u][j];

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < k; j++) printf("%d ", result[i][j]);
		printf("\n");
	}
	return 0;
}

C++

#include <iostream>
using namespace std;

int main()
{
	int n, m, k, a[101][101], b[101][101], result[101][101] = { 0, };
	cin >> n >> m;
	for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) cin >> a[i][j];
	cin >> m >> k;
	for (int i = 0; i < m; i++) for (int j = 0; j < k; j++) cin >> b[i][j];

	for (int i = 0; i < n; i++) for (int j = 0; j < k; j++) for (int l = 0; l < m; l++) result[i][j] += a[i][l] * b[l][j];
	
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < k; j++) cout << result[i][j] << " ";
		cout << "\n";
	}
	return 0;
}

코드 설명

행렬 a의 크기 n,m을 입력받고 반복문을 이용해 행렬 a에 값을 저장한다. 이후 행렬 b의 크기를 m,k를 입력받고 반복문을 이용해 행별 b에 값을 저장한다.

 

행렬의 곱셈 결과로 만들어지는 행렬의 크기는 n×k이니 반복문을 중첩해서 결과를 구한다.

 

 

느낀 점

행렬의 곱셈 방법만 알면 금방 푸는 문제였다!