백준

백준 2740 행렬 곱셈(Java)

Park DJ 2023. 1. 22. 01:00

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

 

2740번: 행렬 곱셈

첫째 줄에 행렬 A의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 순서대로 주어진다. 그 다음 줄에는 행렬 B의 크기 M과 K가 주어진다. 이어서 M개의 줄에 행렬 B의 원소 K개

www.acmicpc.net


 

해석 및 팁

 


 

이 문제를 풀려면 행렬곱셈의 정의를 알고 있어야 합니다. 간단히 설명하면 아래의 사진과 같습니다.

https://ko.wikipedia.org/wiki/%ED%96%89%EB%A0%AC_%EA%B3%B1%EC%85%88

 

행렬 곱셈 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 행렬 곱셈을 위해선 첫째 행렬의 열 갯수와 둘째 행렬의 행 갯수가 동일해야한다. 곱셈의 결과 새롭게 만들어진 행렬은 첫째 행렬의 행 갯수와 둘째 행렬의 열

ko.wikipedia.org

먼저 반복문의 통해 A행렬과 B행렬의 값을 저장한후 공식에 따라 StringBuilder에 저장한 후에 출력해 주면 됩니다.


 

Java 코드

 


import java.util.Scanner;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    StringBuilder sb = new StringBuilder();
   
    int N = sc.nextInt();
    int M = sc.nextInt();
    int[][] a = new int[N][M];

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

    M = sc.nextInt();
    int K = sc.nextInt();
    int[][] b = new int[M][K];
    
     for(int i = 0; i < M; i++) {
      for(int j = 0; j < K; j++) {
        b[i][j] = sc.nextInt();
      }
    }
    
    for(int i = 0; i < N; i++) {
      for(int j = 0; j < K; j++) {
        int sum = 0;
        for(int k = 0; k < M; k++) {
          sum += a[i][k] * b[k][j];
        }
        sb.append(sum).append(" ");
      }
      sb.append('\n');
    }

    System.out.println(sb);
  }
}