행렬의 곱셈

유태형·2022년 2월 8일
0

문제

문제분석

수학에서 배운 그 행렬의 곱셈이 맞다. 각 테이블의 행과 열 곱의 합을 계산하는 문제이다.
https://ko.wikipedia.org/wiki/%ED%96%89%EB%A0%AC_%EA%B3%B1%EC%85%88


풀이

결과 행렬의 크기

의외로 많은 시간이 소비되었던 부분이다. 2차원배열에서 열은 내부배열이고 행은 외부배열이다(행이 열을 감싼 구조) 따라서 앞 테이블의 개수 x 뒷 테이블의 개수 만큼 반복해야 결과 테이블이 완성될 수 있다.

int[][] answer = new int[arr1.length][arr2[0].length];
//arr1은 앞테이블, arr2은 뒷테이블

3중첩 for문

일반적인 중첩 for문의 인덱스를 쓰듯이 i,j,k를 쓴다고 가정하자.

i는 앞테이블의 행을 가리킴 arr1[i][]
j는 뒷테이블의 열을 가리킴 arr2[][j]
k는 앞테이블의 열과 뒷테이블의 행을 가리킴 arr1[i][k], arr2[k][j]

각 요소의 곱을 합해야 하므로

temp += arr1[i][k] * arr2[k][j]

		for(int i=0;i<arr1.length;i++){ // 앞테이블의 행
            for(int j=0;j<arr2[0].length;j++){ //뒷 테이블의 열
                temp=0; //뒷 테이블의 열 마다
                for(int k=0;k<arr2.length;k++) //앞테이블의 열, 뒷 테이블의 행
                    temp += arr1[i][k] * arr2[k][j]; //각 요소의 곱을 합한다
                answer[i][j] = temp; //요소의 합 저장
                
            }
        }

코드

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer = new int[arr1.length][arr2[0].length];
        int temp;
        
        for(int i=0;i<arr1.length;i++){ // 앞테이블의 행
            for(int j=0;j<arr2[0].length;j++){ //뒷 테이블의 열
                temp=0; //뒷 테이블의 열 마다
                for(int k=0;k<arr2.length;k++) //앞테이블의 열, 뒷 테이블의 행
                    temp += arr1[i][k] * arr2[k][j]; //각 요소의 곱을 합한다
                answer[i][j] = temp; //요소의 합 저장
                
            }
        }
        return answer;
    }
}



GitHub

https://github.com/ds02168/Study_Algorithm/blob/master/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4/%EC%9E%90%EB%B0%94/Level2/%ED%96%89%EB%A0%AC%EC%9D%98%20%EA%B3%B1%EC%85%88.txt

profile
오늘도 내일도 화이팅!

0개의 댓글

관련 채용 정보