프로그래머스/Lv. 2

[프로그래머스 코딩테스트] 행렬의 곱셈(Java)

Sigfriede 2023. 6. 27. 01:00

  문제 설명

  2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.

 

  제한사항

  • 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
  • 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
  • 곱할 수 있는 배열만 주어집니다.

 

  입출력 예

arr1 arr2 return
[[1, 4], [3, 2], [4, 1]] [[3, 3], [3, 3]] [[15, 15], [15, 15], [15, 15]]
[[2, 3, 2], [4, 2, 4], [3, 1, 4]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]
class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int rows1 = arr1.length;
        int cols1 = arr1[0].length;
        int rows2 = arr2.length;
        int cols2 = arr2[0].length;
        int[][] answer = new int[rows1][cols2];
        for (int i = 0; i < rows1; i++) {
            for (int j = 0; j < cols2; j++) {
                for (int k = 0; k < cols1; k++) {
                    answer[i][j] += arr1[i][k] * arr2[k][j];
                }
            }
        }
        return answer;
    }
}

  변수 rows1, cols1, rows2, cols2를 생성합니다. 각각 arr1의 행의 길이, 열의 길이, arr2의 행의 길이, 열의 길이를 갖습니다.

  배열 answer의 크기의 행은 arr1의 행의 길이, 열은 arr2의 열의 길이로 지정합니다.

  첫 번째 for문이 arr1의 행의 길이만큼 순회합니다.

  두 번째 for문이 arr2의 열의 길이만큼 순회합니다.

  세 번째 for문이 arr1의 열의 길이만큼 순회합니다.

  answer[i][j] 번째 원소에 arr1[i][k]와 arr2[k][j] 번째 원소를 곱한 값을 더하기 할당합니다.

 

  행렬끼리 곱셈은 다음과 같은 과정을 거칩니다.

  1. 행렬 곱셈을 수행하기 전에 곱셈이 가능한지 확인합니다. 곱셈이 가능하려면 첫 번째 행렬의 열 수와 두 번째 행렬의 행 수가 동일해야 합니다.
  2.  첫 번째 행렬의 각 행과 두 번째 행렬의 각 열을 곱하여 결과 행렬의 해당 위치에 값을 누적시킵니다.
arr1 = [[1, 4], [3, 2], [4, 1]]
arr2 = [[3, 3], [3, 3]]
answer = [[1 * 3 + 4 * 3, 1 * 3 + 4 * 3], [3 * 3 + 2 * 3, 3 * 3 + 2 * 3], [4 * 3 + 1 * 3 + 4 * 3 + 1 * 3]]

A = [[a, b], [c, d], [e, f]]
B = [[g, h], [i, j]]
C = [[a*g + b*i, a*h + b*j], [c*g + d*i, c*h + d*j], [e*g + f*i, e*h + f*j]]