본문 바로가기

Java/백준

[JAVA] 백준 2740 행렬 곱셈

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

 

2740번: 행렬 곱셈

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

www.acmicpc.net

 

- N*M 크기의 행렬 A와 M*K 크기의 행렬 B가 주어졌을 때, 두 행렬을 곱하는 프로그램 

 

 

문제 풀이 

 

행렬의 곱셈 

행렬의 곱셈, 행렬의 거듭제곱 – 수학방 (mathbang.net)

 

행렬의 곱셈, 행렬의 거듭제곱

행렬의 곱셈은 행렬의 실수배에 비하면 훨씬 어려워요. 행렬을 곱할 수 있는 조건이 있어 이 조건을 만족하지 않으면 곱셈을 하지 못하는 경우도 있어요. 게다가 계산방식도 매우 까다롭죠. 도

mathbang.net

 

- 두 행렬 A의 열의 개수와 행렬 B의 행의 개수가 같을 때 , 행렬 A의 제 i행의 각 성분과  행렬 B의 제 j열의 각 성분을 그 순서대로 곱하여 더한 것을 (i,j)성분으로 하는 행렬을 두 행렬 A와 B의 곱이라 하고 기호로 AB와 같이 나타냄 

 

출처 -  행렬의 곱셈, 행렬의 거듭제곱 – 수학방 (mathbang.net)

 

- 행렬 A는 m*k 행렬이고 행렬 B는 k*n 행렬

- (행렬 A의 열의 개수 k) = (행렬 B의 행의 개수 k)이므로 두 행렬을 곱할 수 있음

- 행렬 A와 행렬 B를 곱한 결과인 행렬 AB는 m*n 행렬 

 

ex)

출처 -  행렬의 곱셈, 행렬의 거듭제곱 – 수학방 (mathbang.net)

 

- A는 2*3 행렬, B는 3*2행렬이므로 AB는 2*2 행렬 

- 각 성분을 구해 보면 

출처 -  행렬의 곱셈, 행렬의 거듭제곱 – 수학방 (mathbang.net)

 

- 선으로 연결된 것끼리 곱한 값을 더하고 이런 과정을 반복

 

- 행렬 AB의 (1,1) 성분은 행렬 A의 제 1행 성분과 행렬 B의 제 1열 성분들을 곱해서 더한 값 

a11b11 + a12b21+a12b31

 

- 행렬 AB의 (1,2) 성분은 행렬 A의 제 1행의 성분과 행렬 B의 제 2열 성분들을 곱해서 더한 값

a11b12+a12b22+a13b32

 

- 행렬 AB의 (2,1) 성분은 행렬 A의 제 2행 성분과 행렬 B의 제 1열 성분들을 곱해서 더한 값

a21b11 + a22b21 + a23+b31

 

- 행렬 AB의 (2,2) 성분은 행렬 A의 제 2행의 성분과 행렬 B의 제 2열 성분들을 곱해서 더한 값

a21b12+a22b22+a23b32

 

출처 -  행렬의 곱셈, 행렬의 거듭제곱 – 수학방 (mathbang.net)

 

 

문제 예시 

 

 

정답 

 

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args)throws IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        StringTokenizer st;
        st= new StringTokenizer(br.readLine());
        int row_A = Integer.parseInt(st.nextToken());
        int col_A = Integer.parseInt(st.nextToken());
        
        int A[][] = new int[row_A][col_A];
        for(int i=0; i<row_A; i++)
        {
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<col_A;j++)
            {
                A[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        
        st = new StringTokenizer(br.readLine());
        int row_B = Integer.parseInt(st.nextToken());
        int col_B = Integer.parseInt(st.nextToken());
        
        int B[][] = new int[row_B][col_B];
        for(int i=0; i<row_B; i++)
        {
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<col_B;j++)
            {
                B[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        
        int AB[][] = new int[row_A][col_B];
        for(int i=0; i<row_A; i++)
        {
            for(int j=0; j<col_B; j++)
            {
                for(int k=0; k<row_B; k++)
                {
                    AB[i][j] +=A[i][k]*B[k][j];
                }
            }
        }
        
       for(int i=0; i<AB.length; i++)
       {
    	   for(int j=0; j<AB[i].length;j++)
    	   {
    		   bw.write(AB[i][j]+" ");
    	   }
    	   bw.newLine();
       }
        bw.flush();
        bw.close();
    }
}

 

 

 

'Java > 백준' 카테고리의 다른 글

[JAVA] 백준 2805 나무 자르기  (0) 2024.03.12
[JAVA] 백준 1654 랜선 자르기  (0) 2024.03.12
[JAVA] 백준 11401 이항 계수 3  (3) 2024.03.08
[JAVA] 백준 1629 곱셈  (0) 2024.03.08
[JAVA] 백준 1790 종이의 개수  (0) 2024.03.06