코딩테스트

[프로그래머스] 행렬의 곱셈 (Kotlin)

깨비도 2024. 6. 20. 10:53

행렬의 곱셈

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

 

💡 풀이

우선 행렬의 곱셈에 대해 먼저 알아보자. 난 행렬의 곱셈이 도대체 뭔지 몰라서 한참을 입출력 예만 뚫어지게 쳐다보다 검색하고 나서야 알게 되었다... 나 같은 사람이 또 있을 수도 있으니...

이미지 출처 : https://j1w2k3.tistory.com/575#

행렬의 곱셈은 이렇게 1행  1번 째 값 * 1열 1번 째 값, 1행 2번 째 값 * 2열 1번 째 값 처럼 곱하는 것을 말한다. 설명보단 그림이 확실히 이해가 빠르다. 이 곱셈을 토대로 로직을 짜면 된다.

// arr1은 행으로 곱하고, arr2는 열로 곱하기
class Solution {
    fun solution(arr1: Array<IntArray>, arr2: Array<IntArray>): Array<IntArray> {
        var answer: Array<IntArray> = Array(arr1.size){ i -> // index에 접근 가능
            IntArray(arr2[0].size){ j -> // 동일하게 index에 접근 가능
                var elem:Int = 0  // 들어갈 초기값 명시
                
                // arr1의 행만큼 반복
                for(k:Int in arr1[0].indices){
                    // arr1의 i번째 행의 k번째 값 * arr2의 k번째 열의 j번째 값
                    elem += arr1[i][k] * arr2[k][j]
                }
                
                elem
            }
        }
        
        // var answer = Array(arr1.size) { IntArray(arr2[0].size) }
        // for(i:Int in arr1.indices){
        //     for(j:Int in arr2[0].indices){
        //         for(k:Int in arr1[0].indices){
        //             answer[i][j] += arr1[i][k] * arr2[k][j]
        //         }
        //     }
        // }
        
        return answer
    }
}
  1. answer는 함수 반환 타입에 맞추어 Array<IntArray> 타입으로 선언해준다.
  2. Array(arr1.size)로 arr1.size 크기의 배열을 하나 선언해준다. 중괄호를 열어 파라미터로 index 값을 받아 순서에 접근할 수 있다.
  3. Array 값 안에 IntArray가 필요하기 때문에 IntArray(arr2[0].size)로 arr2[0].size 크기의 배열을 선언해준다. 이 또한 2번과 동일하게 index에 접근한다.
  4. IntArray에 실제로 들어갈 값 elem 초기값을 명시해준다.
  5. arr1의 행만큼 반복문을 돌린다.
  6. arr1의 i번째 (Array의 index)의 k번째 값 * arr2의 k번째 값의 j번째 (IntArray의 index)을 elem에 누적하여 더해준다.
  7. 이를 최종적으로 반환해주면 answer 완성

나는 행렬의 곱셈을 오늘 알았다...ㅠㅠ 큰일이다...!

다른 사람의 풀이를 보고 하나하나 뜯어 해석하며 문제를 풀었다.

 

for문으로 문제를 풀 경우엔 행렬의 곱셈을 이해하기 더 쉽지만

직접 배열을 선언해가며 그 index에 접근해서 문제를 푸니 배열의 index 값이 더 직관적이고 반복문도 한 번 밖에 돌지 않아 로직 자체는 좀 더 눈으로 보기 쉬운 것 같다!