본문 바로가기
코딩테스트/Java

[Level2] 행렬의 곱셈 답안 및 풀이

by SRin23 2021. 12. 23.

◇ 문제 설명

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]]
[[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]]

 

◇ 초기 내용

※ [출처] 프로그래머스-코딩테스트 연습-문제명

※ 초기 내용을 참고하여 문제에 맞는 코드를 작성하세요.

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer = {};
        return answer;
    }
}

 


◇  참고 사항

첫번째, 2차원 배열

  • 1차원 배열이 2개인 것으로 1차원 배열에서는 단순히 직선의 형태였다면 2차원 배열을 행과 열을 가지는 면으로 이루어진다.
  • 흔히 2차원 배열의 행을 i, 열을 j로 표기한다.
  • 2차원 배열의 인덱스 -> [i][j]
    [0][0] [0][1] [0][2] [0][3]
    [1][0] [1][1] [1][2] [1][3]
  • 2차원 배열의 크기
     - 2차원 배열의 행 크기 : arr.length
     - 2차원 배열의 열 크기 : arr[0].length

 

두번째, 행렬의 곱셈 방법

  • 정의 : 행렬 A의 열의 개수와 행렬 B의 행의 개수가 같을 때, A의 i행과 B의 j열의 대응하는 위치에 있는 성분을 차례로 곱하여 더한 것을 (i, j) 성분으로 하는 행렬을 A와 B의 곱이라 한다.
    https://terms.naver.com/entry.naver?docId=2073781&cid=47324&categoryId=47324

  • 두 행렬의 곱셈방법 예시
    a[0][0] a[0][1]
    a[1][0] a[1][1]
    a[2][0] a[2][1]
    b[0][0] b[0][1]
    b[1][0] b[1][1]
     결과
    result[0][0] = 
    a[0][0] * b[0][0]
    + a[0][1] * b[1][0]
    result[0][1] = 
    a[0][0] * b[0][1]
    + a[0][1] * b[1][1]
    result[1][0] = 
    a[1][0] * b[0][0]
    + a[1][1] * b[1][0]
    result[1][1] = 
    a[1][0] * b[0][1]
    + a[1][1] * b[1][1]
    result[2][0] = 
    a[2][0] * b[0][0]
    + a[2][1] * b[1][0]
    result[2][1] = 
    a[2][0] * b[0][1]
    + a[2][1] * b[1][1]
    오른쪽(→)으로 이동시 b의 열 인덱스가 1씩 증가
    아래(↓)로 이동시 a의 행 인덱스 1씩 증가
    각 요소 안에서 a의 열 및 b의 행 인덱스 1씩 증가
    ※ 참고 : 행렬의 곱셈에서 a의 열 인덱스 크기와 b의 행 인덱스 크기는 같다.(다르면 행렬의 곱셈이 정의되지 않음)
 

행렬의 곱셈

[ 1. 교과서 속 주개념] [ 1) 행렬의 곱셈정의] 행렬 A의 열의 개수와 행렬 B의 행의 개수가 같을 때, A의 i행과 B의 j열의 대응하는 위치에 있는 성분을 차례로 곱하여 더한 것을 (i, j) 성분으로 하는

terms.naver.com

 

 

◇ 답안

더보기
더보기
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 l = 0; l<arr2[0].length; l++){
                int temp = 0;
                //첫번째 배열의 열크기, 두번째 배열의 행크기는 같으며, 이를 반복
                for(int j = 0; j<arr1[0].length; j++){
                	//arr1[i][j] * arr2[j][l]의 값을 temp에 더하며 저장(누적합)
                    temp += arr1[i][j]*arr2[j][l];
                }
                //answer[i][l]에 temp 값 저장
                answer[i][l] = temp;
            }
        }
        
        return answer;
    }
}

 

◇ 실행결과

행렬의 곱셈 실행결과

 

◇ 출처

https://programmers.co.kr/learn/challenges

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

댓글