Java/Java 알고리즘

백준 2740번 행렬곱셈 JAVA 구현해보기

kimc 2022. 4. 17. 21:22

```

백준 2740번 행렬 곱셈 JAVA 구현해보기

```

이번 글을 통해 배워갈 내용

  1.  백준 2740번 풀이

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

 

2740번: 행렬 곱셈

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

www.acmicpc.net

 

 

백준 2740번 행렬곱셈은

난이도 브론즈 등급의 문제로서

 

N * M 사이즈 행렬과 M * K 사이즈 행렬을 입력받고

그 행렬들의 곱인 행렬 M * M 사이즈를 구해주면 됩니다.

 

 


30분 정도 위에 링크를 방문하셔서 풀어보시고

안 풀리시는 경우에만 아래 해답을 봐주시면 감사하겠습니다.


행렬 두 개를 입력받고

입력받은 행렬을 곱해줍니다.

그다음 결과 행렬을 출력해줍니다.

 

행렬 곱셈은 여기를 참조해주세요

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

 

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

행렬 곱셈을 위해선 첫째 행렬의 열 갯수와 둘째 행렬의 행 갯수가 동일해야한다. 곱셈의 결과 새롭게 만들어진 행렬은 첫째 행렬의 행 갯수와 둘째 행렬의 열 갯수를 가진다. 행렬 곱셈(matrix mul

ko.wikipedia.org

 

 

 

전체 코드는 아래와 같습니다.

 


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

public class Main {
    static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws IOException {
        // 행렬을 입력받는다
        Matrix matrixA = findInputMatrix();
        Matrix matrixB = findInputMatrix();
        // 행렬의 제곱을 구한다
        Matrix matrixC = multiplyMatrix(matrixA, matrixB);
        // 결과를 출력한다
        printMatrix(matrixC);
    }

    // 행렬을 입력받는다
    private static Matrix findInputMatrix() throws IOException {
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        final int rowSize = Integer.parseInt(st.nextToken());
        final int colSize = Integer.parseInt(st.nextToken());
        int[][] matrix = new int[rowSize][colSize];
        for (int i = 0; i < rowSize; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            for (int j = 0; j < colSize; j++) {
                matrix[i][j] = Integer.parseInt(st.nextToken());
            }
        }
        return new Matrix(rowSize, colSize, matrix);
    }

    // 두 행렬의 곱을 구한다
    private static Matrix multiplyMatrix(Matrix lhsMatrix, Matrix rhsMatrix) throws IOException {

        if (lhsMatrix.getColSize() != rhsMatrix.getRowSize()) {
            throw new IOException();
        }

        int[][] retMatrix = new int[lhsMatrix.getRowSize()][rhsMatrix.getColSize()];
        for (int i = 0; i < lhsMatrix.getRowSize(); i++) {
            for (int j = 0; j < rhsMatrix.getColSize(); j++) {
                retMatrix[i][j] = 0;
                for (int k = 0; k < lhsMatrix.getColSize(); k++) {
                    retMatrix[i][j] += (lhsMatrix.getMat()[i][k] * rhsMatrix.getMat()[k][j]);
                }
            }
        }
        return new Matrix(lhsMatrix.getRowSize(), rhsMatrix.getColSize(), retMatrix);
    }

    // 결과값을 출력한다.
    private static void printMatrix(Matrix matrix) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < matrix.getRowSize(); i++) {
            for (int j = 0; j < matrix.getColSize(); j++) {
                sb.append(matrix.getMat()[i][j]).append(' ');
            }
            sb.setLength(sb.length() - 1);
            sb.append("\n");
        }
        sb.setLength(sb.length() - 1);
        System.out.print(sb);
    }

    // 백준이 아닌 경우 static 제거 후 다른 파일로 이동
    private static class Matrix {
        final private int rowSize;
        final private int colSize;
        final private int[][] mat;

        public Matrix(int rowSize, int colSize, int[][] mat) {
            this.rowSize = rowSize;
            this.colSize = colSize;
            this.mat = mat;
        }

        public int getRowSize() {
            return rowSize;
        }

        public int getColSize() {
            return colSize;
        }

        public int[][] getMat() {
            return mat;
        }
    }


} //codemasterkimc.tistory.com [김씨의 코딩 스토리]

 

 

읽어주셔서 감사합니다

 

무엇인가 얻어가셨기를 바라며

 

오늘도 즐거운 코딩 하시길 바랍니다 ~ :)

 


 

728x90