행렬의 곱셈

KSang·2023년 12월 22일
0

[Kotlin]코드카타

목록 보기
87/100
post-thumbnail

🕵️문제설명

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

⚠️제한사항

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

🔎로직설명

fun solution(arr1: Array<IntArray>, arr2: Array<IntArray>): ArrayList<IntArray> {
        val result = ArrayList<IntArray>()
        for (i in arr1.indices) {
            val row = IntArray(arr2[0].size) { 0 }
            for (j in arr2[0].indices){
                for (k in arr1[0].indices){
                    row[j] += arr1[i][k] * arr2[k][j]
                }
            }
            result.add(row)
        }
        return result
    }

말그대로 행렬의 곱대로 풀어봤다.

수학문제 느낌

여기서 코드를 간결하게 해보겠다.

fun solution(arr1: Array<IntArray>, arr2: Array<IntArray>): ArrayList<IntArray> {
        return arr1.map { row1 ->
            IntArray(arr2[0].size) { j ->
                row1.indices.sumOf { k -> row1[k] * arr2[k][j] }
            }
        }.toCollection(ArrayList())
    }

arr1과 arr2 result를 대충 그려보면 이런 모양일거다

여기서 .map으로 row를 구분

arr1.map { row1 ->

result의 열에 넣어줄 배열을 만들어주고

result의 열과 arr2[0]의 크기가 같기때문에 사이즈를 arr2[0].size로 설정

IntArray(arr2[0].size) { j ->

indices해서 arr1의 요소k를 arr2의 k행 j열의 값과 곱한뒤 더 해주고

row1.indices.sumOf { k -> row1[k] * arr2[k][j] }

.toCollection(ArrayList()): map 함수로 생성된 리스트(List)를 ArrayList로 변환하여 반환한다

0개의 댓글