Problem_Solving

프로그래머스 : 행렬의 곱셈 (자바, JAVA)

CONCAT 2023. 12. 25. 16:28
728x90

설계

  • 행렬 내적은 두 개의 행렬을 곱하는 연산으로, 주어진 두 행렬 A와 B가 있을 때, 결과 행렬 C를 계산하는 방법이다. 이때 A의 열의 수와 B의 행의 수가 일치해야 한다.
  • 먼저, 주어진 두 행렬 A와 B가 다음과 같다고 가정해 본다면,

  • 결과 행렬 C는 m x p 크기를 가지게 된다.
  • 행렬 C의 각 원소 cij는 다음과 같이 계산된다.

  • 코드에서는 이러한 원리를 기반으로 중첩된 반복문을 사용하여 각 원소를 계산하고 결과 배열 C에 저장. 각 원소 cij는 A의 행 i1과 B의 열 j2를 곱한 값들을 모두 더한 값이 된다.

구현

코드

import java.util.*;

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        // 배열1의 행과 열 크기 구하기
        int row1 = arr1.length;       // 배열1의 행 수
        int col1 = arr1[0].length;    // 배열1의 열 수
        System.out.println("배열1 행 : " + row1);
        System.out.println("배열1 열 : " + col1);
        for (int[] r : arr1) {
            System.out.println(Arrays.toString(r));
        }
        // 배열2의 행과 열 크기 구하기
        int row2 = arr2.length;       // 배열2의 행 수
        int col2 = arr2[0].length;    // 배열2의 열 수
        System.out.println("배열2 행 : " + row2);
        System.out.println("배열2 열 : " + col2);
        for (int[] r : arr2) {
            System.out.println(Arrays.toString(r));
        }        
        // 결과를 저장할 새로운 배열 생성
        // 행렬 곱셈 결과는 배열1의 행과 배열2의 열 크기를 가집니다.
        int[][] answer = new int[row1][col2];
        
        // 각 행렬 요소의 곱셈과 덧셈을 계산
        for (int r1 = 0; r1 < row1; r1++) {
            for (int c2 = 0; c2 < col2; c2++) {
                int sum = 0; // 두 행렬의 곱셈 결과를 누적할 변수
                // 행렬 곱셈 수행
                for (int v = 0; v < col1; v++) {
                    sum += arr1[r1][v] * arr2[v][c2];
                }
                // 결과를 새로운 배열에 저장
                answer[r1][c2] = sum;
            }        
        }
        for (int[] r : answer) {
            System.out.println(Arrays.toString(r));
        } 
        // 결과 배열 반환
        return answer;
    }
}