프로그래머스

99클럽 코테 스터디 8일차 TIL 행렬의 곱셈

리콜 2024. 4. 5. 23:53

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

오늘의 학습 키워드

행렬의 곱셈

 

 

행렬의 곱셈을 하는 문제였다.

행렬을 배운지 너무 오래되어 기억이 나지 않았다.

 

 

먼저 행렬을 구하는 방법부터 살펴보게 되었다.

행렬은 첫번째 행렬의 n번째 행의 숫자들과 두번째 행렬의 각 열의 숫자를 첫번째 행렬의 행의 숫자들과 각각 곱한뒤 더하는 것이다.

 

예를 들어 첫번째 행렬의 첫번째 행의 3개의 숫자들 1, 2, 3 과 두번째 행렬의 첫번째 열의 숫자 4,5,6 을 각각 

1 x 4 + 2 x 5 + 3 x 6을 하면 결과 행렬의 0,0의 값이 된다

첫번째 행렬의 첫번째 숫자들과 두번째 행렬의 두번째열과 계산을 하면 

결과 행렬의 0,1의 좌표의 값이 된다.

 

 

 

방식을 알고 노트에 세로 4 가로 3 의 행렬과 가로세로4인 행렬을 곱하다가 멘붕이 왔는데

알고보니 행렬의 곱을 하려면 첫번째 행렬의 가로값과 두번째 행렬의 세로가 같아야 행렬을 곱을 할 수 있는 조건이 있었다.

 

그리고 문제를 보니 

 

3번째 조건이 크게 와 닿았다.

 

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer = new int[arr1.length][arr2[0].length];
        
        //[[1, 4], 
        // [3, 2], 
        // [4, 1]]
        
        //[[3, 3], 
        // [3, 3]]
        for(int i =0; i < arr1.length; i++){
            int temp = 0;
            for(int k =0; k < arr2[i].length; k++){
                temp += arr1[i][k] * arr2[k][i]; 
                if(k == arr1[i].length -1){
                    answer[i][k] = temp;
                }
                
            }
        }
        
        return answer;
    }
}

 

처음에는 코드를 이렇게 짰는데 자꾸 오류가 발생하여 생각을 해본결과 arr2에 집중한 나머지 arr1을 생각치 못햇다.

 

그 후 코드를 수정하여

class Solution {
    public int[][] solution(int[][] arr1, int[][] arr2) {
        int[][] answer = new int[arr1.length][arr2[0].length];
        
        //[[1, 4], 
        // [3, 2], 
        // [4, 1]]
        
        //[[3, 3], 
        // [3, 3]]
        for(int i =0; i < arr1.length; i++){
            for(int j = 0; j < arr2[0].length; j++){
                int temp = 0; // 각 요소별로 초기화
                for(int k = 0; k < arr1[i].length; k++){
                    temp += arr1[i][k] * arr2[k][j];
                }
                answer[i][j] = temp;
            }
        }
        
        return answer;
    }
}

 

최종 코드를 만들게 되었다.

 

주말동안에는 Java언어에 대한 공부와 DFS와 BFS문제를 풀어볼것이다.

반응형