본문 바로가기
알고리즘/백준

[백준/C,C++] 2740번: 행렬 곱셈

by 이민훈 2021. 3. 26.

www.acmicpc.net/problem/2740

 

2740번: 행렬 곱셈

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

www.acmicpc.net

행렬 곱을 구현하면 되는 문제입니다.

 

 

A가 $\begin{pmatrix} a_{11} & a_{12} \\ a_{21} & a_{22} \end{pmatrix}$,

 

B가 $\begin{pmatrix} b_{11} & b_{12} \\ b_{21} & b_{22} \end{pmatrix}$ 라고 가정했을 때

 

두 행렬의 곱은 $\begin{pmatrix} a_{11}b_{11}+a_{12}b_{21} & a_{11}b_{12}+a_{12}b_{22} \\ a_{21}b_{11}+a_{22}b_{21} & a_{21}b_{21}+a_{22}b_{22} \end{pmatrix}$ 으로 나타낼 수 있습니다.

 

 

반복문을 통해 간단히 구현하면 되는 문제입니다.

 

#include<iostream>

using namespace std;

const int MAX = 100;

int n, m, k;

int A[MAX][MAX];
int B[MAX][MAX];
int res[MAX][MAX];

void mult(void)
{
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < k; j++) {
            for (int k = 0; k < m; k++) {
                res[i][j] += A[i][k] * B[k][j];
            }
        }
    }
}

int main(void)
{
    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];
        }
    }

    mult();

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < k; j++) {
            cout << res[i][j] << " ";
        }
        cout << "\n";
    }

    return 0;
}

댓글