[PS/JAVA] (배열/수학) 프로그래머스_12949_행렬의 곱셈

2023. 7. 28. 07:47
반응형

문제 

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 이하인 자연수입니다.
  • 곱할 수 있는 배열만 주어집니다.
입출력 예
arr1 arr2 return
[[1,4], [3,2], [4,1]] [[3, 3][3, 3]] [[15, 15], [15, 15], [15, 15]]
[[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[5, 4, 3], [2, 4, 1], [3, 1, 1]] [[22, 22, 11], [36, 28, 18], [29, 20, 14]]
 

 

 

 

문제에서 인사이트 도출

1. 문제 파악

말 그대로 행렬의 곱셈을 구현하는 문제. 문제파악에 별다른 어려움은 없다.
곱할 수 있는 형태로만 주어지게 되어, 따로 검사를 할 필요도 없다.

2. 입력 파악 

2개의 2차원 배열 arr1, arr2.

출력은 행렬 곱의 결과의 2차원 배열이 되어야 할 텐데, 출력의 차원은 아래와 같다.

3x2 X 2x4 = 3x4 = result[arr1 행의 크기][arr2 열의 길이]

 


문제풀이

 

1. 출력으로 나올 차원에 맞추어 순회

 

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer = new int[arr1.length][arr2[0].length]; 
        for(int i = 0; i < arr1.length; i++){ //결과 행
            for(int j = 0; j < arr2[0].length; j++){ //결과 열


            }
            // answer[i][j] = ?
        }

        return answer;
    }
}

출력으로 [결과 행]은 arr1의 행의 길이, [결과 열]은 arr2의 열의 길이에 해당하므로 출력 차원을 우선으로 생각하면 반복문을 구성하기가 수월하다.

 

 

 

2. 행렬 연산

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer = new int[arr1.length][arr2[0].length];  
        for(int i = 0; i < arr1.length; i++){ // 결과 행 = arr1 행 순회(아래쪽 방향)
            for(int j = 0; j < arr2[0].length; j++){ //결과 열 = arr2 열 순회(오른쪽 방향)
                int sum = 0;
                for(int k = 0; k < arr2.length; k++){ //arr2 행 순회(아래쪽 방향)
                    sum += arr1[i][k] * arr2[k][j];
                }
                answer[i][j] = sum;


            }
        }

        return answer;
    }
}

arr1의 하나의 행은, arr2의 하나의 열에 대한 모든 행에 대해서 곱셈의 합의 연산이 이루어져야 한다.

따라서 arr2의 행을 순회하는 반복문을 추가하여, 위의 계산과정을 행한다.

계산 결과는 answer[i][j]에 담아둔다.

 


최종 소스코드

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer = new int[arr1.length][arr2[0].length];  
        for(int i = 0; i < arr1.length; i++){ // 결과 행 = arr1 행 순회(아래쪽 방향)
            for(int j = 0; j < arr2[0].length; j++){ //결과 열 = arr2 열 순회(오른쪽 방향)
                int sum = 0;
                for(int k = 0; k < arr2.length; k++){ //arr2 행 순회(아래쪽 방향)
                    sum += arr1[i][k] * arr2[k][j];
                }
                answer[i][j] = sum;


            }
        }

        return answer;
    }
}
반응형

BELATED ARTICLES

more