알고리즘

[백준, 자바, 2740번] 행렬 곱셈

hminor 2024. 11. 22. 17:51
반응형

풀이

  • 해당 문제는 뭔가 손으로는 가능한데
  • 계속 머리가 멈춘것 처럼 해결 방법이 떠오르지 않아서
  • 고민해보다가 그냥 단순히 하나씩 적용해보다 풀림
  • 이러한 유형의 문제는 고민보단, 떠오르는 대로 먼저 시도해보는게
  • 아이디어가 나오기 좋은 행동이라는 것을 다시 확인
  • 해당 문제에선 기존 2차원 배열에서 탐색하는 방법을 거꾸로 해서
  • 행열 -> 열행 순서로 접근하는 형식으로 해결

 

import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;

public class _2740 {
    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 = new StringTokenizer(br.readLine());
        int N = Integer.parseInt(st.nextToken());
        int M1 = Integer.parseInt(st.nextToken());
        int[][] li1 = new int[N][M1];
        for (int i=0; i<N; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j=0; j<M1; j++) li1[i][j]=Integer.parseInt(st.nextToken());
        }
        st = new StringTokenizer(br.readLine());
        int M2 = Integer.parseInt(st.nextToken());
        int K= Integer.parseInt(st.nextToken());
        int[][] li2 = new int[M2][K];
        for (int i=0; i<M2; i++) {
            st = new StringTokenizer(br.readLine());
            for (int j=0; j<K; j++) li2[i][j]=Integer.parseInt(st.nextToken());
        }
        int[][] result = new int[N][K];
        for (int i=0; i<K; i++) { // 0 1 2
            for (int j=0; j<M1; j++) { // 0 1
                for (int x=0; x<N; x++) { // 0 1 2
                    result[x][i]+=li2[j][i]*li1[x][j];
                }
            }
        }
        for (int num[]: result) {
            for (int n: num) bw.write(n+" ");
            bw.write("\n");
        }
        bw.flush();
    }
}


// 1 2   -1 -2  0
// 3 4    0  0  3
// 5 6