백준
2740)행렬 곱셈
포도몽2
2019. 2. 21. 16:24
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 |