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와 같이 나타냄
- 행렬 A는 m*k 행렬이고 행렬 B는 k*n 행렬
- (행렬 A의 열의 개수 k) = (행렬 B의 행의 개수 k)이므로 두 행렬을 곱할 수 있음
- 행렬 A와 행렬 B를 곱한 결과인 행렬 AB는 m*n 행렬
ex)
- A는 2*3 행렬, B는 3*2행렬이므로 AB는 2*2 행렬
- 각 성분을 구해 보면
- 선으로 연결된 것끼리 곱한 값을 더하고 이런 과정을 반복
- 행렬 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
문제 예시
정답
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 |