본문 바로가기
코딩 테스트/[JAVA] programmers 코딩 테스트 연습

[Programmers/JAVA] 행렬의 곱셈 / 프로그래머스 코딩 테스트 연습

by M개발자 2021. 12. 23.
반응형

행렬의 곱셈


문제 설명

 

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


예시

 

 

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]]
[[1, 2, 3], [4, 5, 6]]  [[1, 4], [2, 5], [3, 6]]  [[14, 32], [32, 77]]

코드 해석 및 전체 코드

 

1. 행렬의 곱셈으로 나오는 행렬로 answer의 크기 잡음 m*k * k*n --> m*n

2. 삼중 for문으로 바깥 for문은 answer의 행만큼 반복

3. 중간 for문은 answer의 열만큼 반복

4. 안쪽 for문은 arr2의 행만큼 반복

행열곱셈  배열 a1과 a2를 곱하는 것은 a1의 행과 a2의 열을 곱하는 것을 말함

 

코드를 짜기 위해 a1 배열 어디와 a2 배열 어디가 곱해서 나오는 값을 answer 배열 어디에 저장하는지 직접 구해보면 풀 수 있음.

 

예시 1로 직접 문제를 풀어보자면, 

arr1[0][0] * arr2[0][0] // 3
+ arr1[0][1] * arr2[1][0] // 12
= 15
arr[0][0] * arr[1][0] //3
+ arr[0][1] * arr[1][1] //12
= 15
arr[1][0] * arr[1][1] // 9
+ arr1[1][0] * arr[1][0] // 6
= 15
arr[1][0] * arr[1][1] // 9
+ arr[0][1] * arr[1][1] // 6
= 15
arr[2][0] * arr[2][1] // 12
+ arr1[1][0] * arr[1][0] // 3
= 15
arr[2][0] * arr[2][1] // 12
+ arr[0][1] * arr[1][1] // 3
= 15

3중 for문을 돌리면서 주어진 변수를 활용하여 이차원 배열 어디에 넣어야 반복되어 값을 곱하고 더해 저장하는 지 알 수 있다.

arr1[i][k] * arr[k][j]

 

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        // m*k * k*n --> m*n
        int[][] answer = new int[arr1.length][arr2[0].length];
        // System.out.println(answer.length); // 3
        // System.out.println(answer[0].length); // 2
        
        // i : answer.length == 3
        // j : answer[0].length == 2
        // k : arr2.length == 2
        for(int i = 0; i < answer.length; i++){
            for(int j = 0; j < answer[0].length; j++){
                int sum = 0;
                for(int k = 0; k < arr2.length; k++){
                    sum += arr1[i][k] * arr2[k][j];
                    //System.out.println("i : " + i + "  j : " + j + "  k : " + k + "  sum : " + sum);
                }
                answer[i][j] = sum;
            }
        }
        return answer;
    }
}

 


github

programmers

 

반응형

댓글