❓ 행렬의 곱셈
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
💡 풀이
우선 행렬의 곱셈에 대해 먼저 알아보자. 난 행렬의 곱셈이 도대체 뭔지 몰라서 한참을 입출력 예만 뚫어지게 쳐다보다 검색하고 나서야 알게 되었다... 나 같은 사람이 또 있을 수도 있으니...
행렬의 곱셈은 이렇게 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
}
}
- answer는 함수 반환 타입에 맞추어 Array<IntArray> 타입으로 선언해준다.
- Array(arr1.size)로 arr1.size 크기의 배열을 하나 선언해준다. 중괄호를 열어 파라미터로 index 값을 받아 순서에 접근할 수 있다.
- Array 값 안에 IntArray가 필요하기 때문에 IntArray(arr2[0].size)로 arr2[0].size 크기의 배열을 선언해준다. 이 또한 2번과 동일하게 index에 접근한다.
- IntArray에 실제로 들어갈 값 elem 초기값을 명시해준다.
- arr1의 행만큼 반복문을 돌린다.
- arr1의 i번째 (Array의 index)의 k번째 값 * arr2의 k번째 값의 j번째 (IntArray의 index)을 elem에 누적하여 더해준다.
- 이를 최종적으로 반환해주면 answer 완성
나는 행렬의 곱셈을 오늘 알았다...ㅠㅠ 큰일이다...!
다른 사람의 풀이를 보고 하나하나 뜯어 해석하며 문제를 풀었다.
for문으로 문제를 풀 경우엔 행렬의 곱셈을 이해하기 더 쉽지만
직접 배열을 선언해가며 그 index에 접근해서 문제를 푸니 배열의 index 값이 더 직관적이고 반복문도 한 번 밖에 돌지 않아 로직 자체는 좀 더 눈으로 보기 쉬운 것 같다!
'코딩테스트' 카테고리의 다른 글
[프로그래머스] 기사단원의 무기 (Kotlin) (0) | 2024.06.24 |
---|---|
[프로그래머스] 모의고사 (Kotlin) (0) | 2024.06.21 |
[프로그래머스] 과일 장수 (Kotlin) (0) | 2024.06.18 |
[프로그래머스] 명예의 전당 (1) (Kotlin) (2) | 2024.06.15 |
[프로그래머스] 가장 가까운 같은 글자 (Kotlin) (1) | 2024.06.15 |