기록 보관소

[Baekjoon/백준] 2740번: 행렬 곱셈(C/C++) 본문

코딩 테스트/백준

[Baekjoon/백준] 2740번: 행렬 곱셈(C/C++)

JongHoon 2022. 5. 7. 21:09

단계별로 풀어보기 20단계(분할 정복) 6번 문제

https://www.acmicpc.net/step/20

 

분할 정복 단계

히스토그램에서 가장 큰 직사각형을 찾는 문제. (※인터넷에 널리 알려져 있는 풀이와 달리, 분할 정복 과정에서 어떠한 자료구조도 필요 없습니다.)

www.acmicpc.net


백준 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가 주어졌을 때, 두 행렬을 곱하는 프로그램을 작성하시오.


입력과 출력

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

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


접근 방법

이번 문제는 N * M 크기의 A 행렬과 M * K 크기의 B 행렬을 곱해서 그 값을 행렬로 출력하는 문제다.

N과 M, K 값이 100보다 작거나 같고, 원소 값도 100보다 작거나 같아서 그냥 간단하게 N M을 입력받아서 이중 반복문을 통해서 이중 배열 A를 입력받고, M K를 입력받고 이중 반복문을 통해서 이중배열 B를 입력받은 뒤, 결괏값으로 출력할 이중 배열을 하나 더 만들어서 삼중 반복문(N, M, K를 사용해야하므로)을 통해 A와 B를 곱한 값을 입력받아 출력하면 면 문제를 해결할 수 있다.


코드

#include <iostream>
using namespace std;
#define MAX 101

int A[MAX][MAX], B[MAX][MAX], C[MAX][MAX];

int main(int argc, char *argv[]) {
	int N, M, K;
	
	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 h = 0; h < M; h++)
				C[i][j] += A[i][h] * B[h][j];

			cout << C[i][j] << " ";
		}
		cout << endl;
	}

	return 0;
}

결과

백준 제출 결과