sm 기술 블로그

169. 2740(행렬곱셈) - 자바 본문

문제/백준_자바

169. 2740(행렬곱셈) - 자바

sm_hope 2022. 8. 2. 21:21
import java.util.*;
import java.io.*;

class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String[] tmpNM = br.readLine().split(" ");
		int N = Integer.parseInt(tmpNM[0]);
		int M = Integer.parseInt(tmpNM[1]);

		int[][] A = new int[N][M];

		for (int i = 0; i < N; i++) {
			String[] tmpA = br.readLine().split(" ");
			for (int j = 0; j < M; j++) {
				A[i][j] = Integer.parseInt(tmpA[j]);
			}
		}

		String[] tmpMK = br.readLine().split(" ");
		M = Integer.parseInt(tmpMK[0]);
		int K = Integer.parseInt(tmpMK[1]);

		int[][] B = new int[M][K];

		for (int i = 0; i < M; i++) {
			String[] tmpB = br.readLine().split(" ");
			for (int j = 0; j < K; j++) {
				B[i][j] = Integer.parseInt(tmpB[j]);
			}
		}

		int[][] result = new int[N][K];

		for (int n = 0; n < N; n++) {
			for (int k = 0; k < K; k++) {
				for (int m = 0; m < M; m++) {
					result[n][k] += A[n][m] * B[m][k];
				}
			}
		}

		for (int n = 0; n < N; n++) {
			for (int k = 0; k < K; k++) {
				System.out.print(result[n][k] + " ");
			}
			System.out.println();
		}
	}
}

문제요약

행렬 곱을 진행하라

설명

이 문제의 핵심은 아래와 같다.

N*M 행렬과  M*K 행렬을 곱하면 N*K행렬이 나온다.

숫자가 작기 때문에 크게 어렵게 생각할 것 없이 행렬곱 식을 그대로 사용하면 된다.

 

따라서 

		for (int n = 0; n < N; n++) {
			for (int k = 0; k < K; k++) {
				for (int m = 0; m < M; m++) {
					result[n][k] += A[n][m] * B[m][k];
				}
			}
		}

다음과 같은 식이 나오게 된 것이다.

'문제 > 백준_자바' 카테고리의 다른 글

171. 10830(피보나치 수 6) - 자바  (0) 2022.08.05
170. 10830(행렬 제곱) - 자바  (0) 2022.08.04
168. 1629(이항계수3) - 자바  (0) 2022.08.01
167. 1629(곱셈) - 자바  (0) 2022.07.31
166. 1780(종이의 개수) - 자바  (0) 2022.07.31
Comments