본문 바로가기

백준

2740)행렬 곱셈

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


행렬 곱셈할 때 인덱스만 신경쓰면 쉽게 구현할 수 있다.


3x2인 행렬 A와 2x3인 행렬 B를 곱한다고 하자.

A의 1행과 B의 1열을 곱할 때 i는 A의 행을 고정하고 k는 B의 열을 고정한 상태에서


j를 움직여 각각의 원소를 매칭시키고 그 결과를 C[i,j]에 저장하면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include<stdio.h>
 
int main() {
    int N,M, K;
    int **A, **B, **C;
    int temp;
 
    scanf("%d %d",&N,&M);
    A = (int **)malloc(sizeof(int *)*N);
    for (int i = 0; i < N;i++) {
        A[i] = (int *)malloc(sizeof(int)*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);
    B = (int **)malloc(sizeof(int *)*M);
    for (int i = 0; i < M; i++) {
        B[i] = (int *)malloc(sizeof(int)*K);
    }
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < K; j++) {
            scanf("%d"&B[i][j]);
        }
    }
 
    C = (int **)malloc(sizeof(int *)*N);
    for (int i = 0; i < N; i++) {
        C[i] = (int *)malloc(sizeof(int)*K);
    }
 
    for (int i = 0; i < N;i++) {
        for (int j = 0; j < K;j++) {
            temp = 0;
            for (int k = 0; k < M;k++) {
                temp += A[i][k] * B[k][j];
            }
            C[i][j] = temp;
        }
    }
 
    for (int i = 0; i < N;i++) {
        for (int j = 0; j < K;j++) {
            printf("%d ",C[i][j]);
        }
        printf("\n");
    }
 
    return 0;
}
cs


'백준' 카테고리의 다른 글

2210)숫자판 점프  (0) 2019.02.23
6679)싱기한 네 자리 숫자  (0) 2019.02.23
2312)수 복원하기  (0) 2019.02.21
2667)단지 번호 붙이기  (0) 2019.02.20
2965)캥거루 세 마리  (0) 2019.02.19