📍 Matrix Multiplication Calculator

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

 

 

 

첫 번째 테스트케이스

 

N이랑 P가 같아야지 곱할수 있는데, (A의 열 == B의 행)

두 번째 테스트케이스는 N과 P의 값이 각각 3, 2이므로 계산할 수 없다. => undefined

 

 

 

해야할 것은 총 4가지이다.

1. matrix 만들기

2. 계산하기

3. 출력조건

4. 종료조건

 

 

 

✨ 전체코드 ✨

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

public class Main {

    static BufferedReader sc = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;
    static StringBuilder sb = new StringBuilder();

    static int[][] A;
    static int[][] B;
    static int[][] C;

    public static void main(String[] args) throws IOException {
        int testcase = 1;

        while (true) {
            st = new StringTokenizer(sc.readLine());
            int M = Integer.parseInt(st.nextToken());
            int N = Integer.parseInt(st.nextToken());
            int P = Integer.parseInt(st.nextToken());
            int Q = Integer.parseInt(st.nextToken());

            // 종료조건
            if (M == 0 && N == 0 && P == 0 && Q == 0) break;

            // 출력조건
            sb.append("Case #").append(testcase).append(":\n");

            // 1. matrix 만들기
            A = new int[M][N];
            B = new int[P][Q];
            MakeMatrix(A, M, N);
            MakeMatrix(B, P, Q);

            if (N == P) {

                // 2. 계산하기
                C = new int[M][Q];
                Calculator(M, N, Q);

                // 출력조건
                for (int i = 0; i < M; i++) {
                    sb.append("| ");
                    for (int j = 0; j < Q; j++) {
                        sb.append(C[i][j]).append(" ");
                    } sb.append("|\n");
                }

            } else sb.append("undefined\n");  // 계산불가
            testcase++;
        } System.out.print(sb);
    }


    // 1.
    private static void MakeMatrix(int[][] array, int r, int c) throws IOException {
        for (int i = 0; i < r; i++) {
            st = new StringTokenizer(sc.readLine().trim());
            for (int j = 0; j < c; j++) {
                array[i][j] = Integer.parseInt(st.nextToken());
            }
        }
    }

    // 2.
    private static void Calculator(int M, int N, int Q) {
        for (int i = 0; i < M; i++) {
            for (int j = 0; j < Q; j++) {
                int sum = 0;
                for (int k = 0; k < N; k++) {
                    sum += A[i][k] * B[k][j];
                } C[i][j] = sum;
            }
        }
    }
}

 

 

 

🌀 성능

  • 메모리 : 14,316 KB
  • 시간 : 136 ms

 

 

 


라떼는 정규교육과정에 행렬 없었다 ㅠ..

입출력 예시 그리면서 이산수학 기억 끄집어냈는데 행렬만 알면 어려운 문제는 아닌듯