Algorithm/기타

[백준 2740번] 행렬 곱셈

agility 2020. 1. 8. 23:56

백준알고리즘 2740번 : 행렬 곱셈

 

크기 N, M인 행렬 A와 크기 M, K인 행렬 B가 주어진다.

문제를 보면 알 수 있겠지만,

행렬곱에서는 첫 번째 행렬(A)의 열(M)과 두 번째 행렬(B)의 행(M)이 일치해야 한다.

그리고 N*M 와 M*K의 행렬 곱의 결과는 크기 N,K인 행렬이 된다.

즉 첫 번째 행렬(A)의 행(N)의 높이를 갖고, 두 번째 행렬(B)의 열(K)의 길이를 갖게되는 것이다.

 

이를 이해한 뒤, 행렬곱이 이루어지는 logic에 따라 for문을 구현해야한다.

나는 3중 for문으로 구현하였다.

 

4*2인 행렬 A와 2*4인 행렬 B를 예로 들어보자.

AXB인 행렬 C는 4*4인 행렬이 될 것이다.

 

1. A의 1행 1열에 담긴 값을 B의 1행 1열에 담긴 값들과 곱한다. (1번 수행) [for문 1번 수행]

2. A의 1행 {2열, 3열, 4열}도 B의 1행 {2열, 3열, 4열}과 곱하므로, 1번의 과정을 4번 반복한다. [for문 1번 수행]

3. 2번의 과정을 2행에도 진행해야하므로, 총 2번 반복한다. [for문 1번 수행]

 

 

풀이 과정


1. 크기 N, M인 행렬 A와 크기 M, K인 행렬 B를 받아 각각 행렬 변수에 집어넣는다.
2. 3중 for문을 통해 행렬 곱을 수행한다.
3. 계산된 행렬을 출력한다.

 

 

소스 ▽

더보기

 

import java.util.Scanner;

public class Main {// 2740번 행렬 곱셈

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int columnN = sc.nextInt();
		int rowN = sc.nextInt();
		int[][] N = new int[columnN][rowN];

		for (int i = 0; i < columnN; i++) {
			for (int j = 0; j < rowN; j++) {
				N[i][j] = sc.nextInt();
			}
		}

		int columnM = sc.nextInt();
		int rowM = sc.nextInt();
		int[][] M = new int[columnM][rowM];

		for (int i = 0; i < columnM; i++) {
			for (int j = 0; j < rowM; j++) {
				M[i][j] = sc.nextInt();
			}
		}

		int[][] ans = new int[columnN][rowM];

		for (int i = 0; i < columnN; i++) {
			for (int j = 0; j < rowM; j++) {
				for (int j2 = 0; j2 < columnM; j2++) {
					ans[i][j] += N[i][j2] * M[j2][j];
				}
			}
		}

		for (int i = 0; i < ans.length; i++) {
			for (int j = 0; j < ans[0].length; j++) {
				System.out.print(ans[i][j] + " ");
			}
			System.out.println();
		}

	}
}