[프로그래머스]행렬의 곱셈 with Java

hyeok ryu·2024년 5월 23일
0

문제풀이

목록 보기
138/154

문제

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


입력

  • 2차원 행렬 arr1과 arr2

출력

  • arr1에 arr2를 곱한 결과를 반환

풀이

제한조건

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

접근방법

단순 구현

학부생 시절 자료 구조 시간 Sparse Matrix를 처음 볼 때, 해봤던 행렬의 곱셈이다.

제한 조건에서 항상 곱할 수 있는 행렬로 주어진다고 명시되어 있다.
따라서 AxB 형태의 행렬과 BxC형태의 행렬이 주어짐을 알 수 있다.

결과는 AxC의 형태로 나올 것이다.
A, B, C의 크기를 각각 구해보자.

결과 행렬의 1행 1열의 값을 구하는 과정을 생각해보자.
첫 번재 행렬의 1행과 두 번째 행렬의 1열이 필요하다.
각각의 원소값을 곱하여 더하면 결과를 완성할 수 있다.

결과 행렬의 1행 2열의 값은 구하는 과정도 생각해보자
첫 번재 행렬의 1행과 두 번째 행렬의 2열이 필요하다.

그럼 일반화하자면, 결과행렬의 a행 b열의 값을 구하고자 한다면,
첫 번째 행렬의 a행과 두 번째 행렬의 b열의 값이 필요하고
각각의 원소를 곱하여 더하는 행위가 c번 반복되는것을 알 수 있다.

일반화 된 수식을 코드로 표현해보자.


코드

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int r = arr1.length;
        int c = arr2[0].length;
        int m = arr2.length;
        int[][] answer = new int[r][c];
        for(int i = 0; i < r; ++i)
            for(int j = 0; j < c; ++j)
                for(int k = 0; k < m; ++k)
                    answer[i][j] +=  arr1[i][k] * arr2[k][j];
            
        return answer;
    }
}

0개의 댓글