Programmers/Lv.2

[프로그래머스][Lv.2][Java] 행렬의 곱셈

dbssk 2023. 7. 29. 17:54

문제

https://school.programmers.co.kr/learn/courses/30/lessons/12949

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

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

 

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

 

풀이

두 행렬 A와 B를 곱하려면 다음과 같은 규칙을 따라야 한다.

A 행렬의 열 수 (열 개수)와 B 행렬의 행 수 (행 개수)가 동일해야 한다. 즉, A 행렬의 열 수가 n이고 B 행렬의 행 수가 n이라면 곱셈이 가능하다. (문제에서 곱할 수 있는 배열만 주어진다고 했으니 현재는 신경쓸 필요는 없다.)

결과 행렬의 크기는 A 행렬의 행 수와 B 행렬의 열 수로 결정된다. 따라서 결과 행렬의 크기는 (A의 행 수) × (B의 열 수)가 된다.

행렬 A와 B의 곱셈은 아래와 같이 수행된다

  • A는 m × n 행렬 (m개의 행과 n개의 열로 이루어진 행렬)
  • B는 n × p 행렬 (n개의 행과 p개의 열로 이루어진 행렬)
  • 결과 행렬 C는 m × p 행렬


결과 행렬 C의 (i, j)번째 원소는 A의 i번째 행과 B의 j번째 열의 내적(dot product)으로 계산된다. 내적은 각 원소들끼리 곱한 뒤 그 값을 모두 더하는 것을 의미한다.

즉, C(i, j) = Σ(A(i, k) × B(k, j)) for k = 1 to n

여기서 A(i, k)는 A 행렬의 i번째 행의 k번째 원소이고, B(k, j)는 B 행렬의 k번째 행의 j번째 원소이다.

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int rows1 = arr1.length;
        int cols1 = arr1[0].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++) {
                int sum = 0;
                for (int k = 0; k < cols1; k++) {
                    sum += arr1[i][k] * arr2[k][j];
                }
                answer[i][j] = sum;
            }
        }
        
        return answer;
    }
}