Dev/Algorithm

간만의 알고리즘 공부 - 5 (행렬 곱셈)

healthyryu 2024. 7. 3. 23:40
문제 설명
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.

제한 조건
- 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
- 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
- 곱할 수 있는 배열만 주어집니다.

 

입출력 예

 

 

내가 시도한 방법

fun solution(arr1: Array<IntArray>, arr2: Array<IntArray>): Array<IntArray> {
    var answer = arrayOf<IntArray>()
    val answerList = answer.toMutableList()

    for (arr1RowIndex in arr1.indices) {
        var answerColumn = mutableListOf<Int>()
        var count = 0
        for (arr2RowIndex in arr2.indices) {
            var num = 0

            for (arr1ColumnIndex in arr1[arr1RowIndex].indices) {
                num += arr1[arr1RowIndex][arr1ColumnIndex] * arr2[arr1ColumnIndex][count]
            }
            count++
            answerColumn.add(num)
        }
        answerList.add(answerColumn.toIntArray())
    }

    answer = answerList.toTypedArray()
    return answer
}

 

 

기본적으로 행렬의 곱셈 자체를 잊어버린지 한참됐고, 그래서 행렬의 곱셈을 검색해서 다시 이해하는데 시간이 꽤 걸렸다. 수학의 정석을 행렬만 봤었던 기억만 남았는데... 머릿속에서 수학은 완전 사라졌는지 오렌지...

 

기본적인 입출력예만 통과하고 테스트케이스는 모조리 실패

 

 

행렬

 

행렬곱셈

참고 https://mathbang.net/562#gsc.tab=0

 

행렬의 곱셈, 행렬의 거듭제곱

행렬의 곱셈은 행렬의 실수배에 비하면 훨씬 어려워요. 행렬을 곱할 수 있는 조건이 있어 이 조건을 만족하지 않으면 곱셈을 하지 못하는 경우도 있어요. 게다가 계산방식도 매우 까다롭죠. 도

mathbang.net

 

행렬 곱셈을 위해선 첫째 행렬의 열 갯수와 둘째 행렬의 행 갯수가 동일해야한다. 곱셈의 결과 새롭게 만들어진 행렬은 첫째 행렬의 행 갯수와 둘째 행렬의 열 갯수를 가진다.

 

코드 첨삭

fun solution(arr1: Array<IntArray>, arr2: Array<IntArray>): Array<IntArray> {
    // 행렬 곱셈이 가능하려면 arr1의 열의 수와 arr2의 행의 수가 같아야 한다.
    val rowCount1 = arr1.size
    val colCount1 = arr1[0].size
    val rowCount2 = arr2.size
    val colCount2 = arr2[0].size

    // 결과 행렬의 크기는 arr1의 행의 수 x arr2의 열의 수
    val answer = Array(rowCount1) { IntArray(colCount2) }

    // 행렬 곱셈 수행
    for (i in 0 until rowCount1) {
        for (j in 0 until colCount2) {
            for (k in 0 until colCount1) {
                answer[i][j] += arr1[i][k] * arr2[k][j]
            }
        }
    }

    return answer
}

 

일단은 첨삭 받은 코드를 보고 이해하는걸로 만족 해야겠다.

반응형