-
[백준 2740번] 행렬 곱셈Algorithm/기타 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(); } } }
'Algorithm > 기타' 카테고리의 다른 글
[백준 1834번] 나머지와 몫이 같은 수 (Java 풀이) (0) 2020.01.14 [백준 2851번] 슈퍼마리오 (0) 2020.01.12 [백준 11005번] 진법 변환 2 (1) 2020.01.05 [백준 11655번] ROT13 (0) 2020.01.01 [백준 10798번] 세로읽기 (0) 2019.12.30