티스토리 뷰

본 글은 다크모드에 최적화되어 있습니다.

문제

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

 

2740번: 행렬 곱셈

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

www.acmicpc.net

언어

자바 Java

해설

선형대수학에서 배우는 행렬을 코드로 작성하면 되는 문제입니다.

 

 

위의 행렬을 계산하면 1행 결과로 [-1, -2, 6]이라는 결과를 얻게 됩니다. -1은 (1 * -1) + (2 * 0), -2는 (1 * -2) + (2 * 0), 그리고 6은 (1 * 0) + (2 * 3)을 통해 얻게 됩니다. 여기서 알 수 있는 점은 왼쪽 행렬은 2차원 index만 변경되고, 오른쪽 행렬은 1차원 index만 변경하며 곱하고 있음을 알 수 있습니다. 이를 다음과 같이 코드로 작성할 수  있습니다.

static int getMultiply(int[] arr1, int[][] arr2, int w) {
    int sum = 0;
    for (int i = 0; i < arr1.length; i++) {
        sum += arr1[i] * arr2[i][w];
    }
    return sum;
}

 

배열 arr1은 행만 담고 있는 배열([1,2])이고, 배열 arr2는 곱의 대상인 행렬을 의미합니다. 이때, w는 행렬 (n x m)(m x k)에서 공통되는 m을 의미합니다. sum을 계산하는 과정을 보면, arr1은 열의 위치만 변경하고 있고, arr2는 열을 고정한 채 행의 위치만 변경하며 계산하고 있습니다. 이는 사진에서 보았듯이, 왼쪽 행렬은 열만 변경되고, 오른쪽 행렬은 행만 변경하며 계산하는 과정이라고 볼 수 있습니다.

코드

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuffer sb = new StringBuffer();

        String[] input = br.readLine().split(" ");
        int n = Integer.parseInt(input[0]);
        int m = Integer.parseInt(input[1]);
        int[][] arr1 = new int[n][m];
        for (int i = 0; i < n; i++) {
            input = br.readLine().split(" ");
            for (int j = 0; j < m; j++)
                arr1[i][j] = Integer.parseInt(input[j]);
        }

        input = br.readLine().split(" ");
        int k = Integer.parseInt(input[1]);
        int[][] arr2 = new int[m][k];
        for (int i = 0; i < m; i++) {
            input = br.readLine().split(" ");
            for (int j = 0; j < k; j++)
                arr2[i][j] = Integer.parseInt(input[j]);
        }


        for (int i = 0; i < n; i++) {
            for (int w = 0; w < k; w++)
                sb.append(getMultiply(arr1[i], arr2, w) + " ");

            sb.append("\n");
        }

        System.out.println(sb);
    }

    static int getMultiply(int[] arr1, int[][] arr2, int w) {
        int sum = 0;
        for (int i = 0; i < arr1.length; i++) {
            sum += arr1[i] * arr2[i][w];
        }
        return sum;
    }
}

 

 

Total
Today
Yesterday
최근에 올라온 글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30