✨ Lv. 2 - 행렬의 곱셈
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12949
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
우선 행렬의 곱셈 방식에 대해서 알아봅시다. 행렬의 곱셈은 아래와 같이 계산합니다.
앞 행렬을 A
, 뒷 행렬을 B
라 했을 때, A
의 i
행과 B
의 j
열을 각각 곱하여 더한 값이 새로운 행렬의 (i, j)
값이 됩니다. 이를 바탕으로 아래와 같이 코드를 작성하였습니다.
function solution(arr1, arr2) {
let result = Array.from({length: arr1.length}, () => []);
for(let i = 0; i < arr1.length; i++) {
for(let j = 0; j < arr2[0].length; j++) {
let current = arr1[i].reduce((s, v, idx) => s + (v * arr2[idx][j]), 0);
result[i].push(current);
}
}
return result;
}
행렬의 곱셈의 결과는 A
행렬이 m x k
, B
행렬이 k x n
일 경우에 m x n
행렬이 됩니다. 따라서 m
개의 행을 가지고 있는 빈 배열을 생성하였습니다. 이후 행렬 곱셈의 규칙에 따라 행렬 곱셈의 결과값을 return 하였습니다.
이를 map
과 reduce
를 활용하여 아래와 같이 간단하게 작성할 수 있습니다.
function solution(arr1, arr2) {
return arr1.map((row) => {
return arr2[0].map((_, i) => {
return row.reduce((s, v, idx) => s + v * arr2[idx][i], 0);
})
})
}