2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
곱할 수 있는 배열만 주어집니다.
arr1 | arr2 | return |
---|---|---|
[[1, 4], [3, 2], [4, 1]] | [[3, 3], [3, 3]] | [[15, 15], [15, 15], [15, 15]] |
[[2, 3, 2], [4, 2, 4], [3, 1, 4]] | [[5, 4, 3], [2, 4, 1], [3, 1, 1]] | [[22, 22, 11], [36, 28, 18], [29, 20, 14]] |
행렬의 곱
첫 번째 행렬(A)의 행과 두 번째 행렬(B)의 열을 곱해 새로운 행렬을 만든다.
예시
A = [ a11 a12 ] [ a21 a22 ] B = [ b11 b12 ] [ b21 b22 ] AB = [ a11*b11 + a12*b21 a11*b12 + a12*b22 ] [ a21*b11 + a22*b21 a21*b12 + a22*b22 ]
i
: 첫 번째 행렬의 행을 의미j
: 두 번째 행렬의 열을 의미k
: 첫 번째 행렬의 열(= 두 번재 행렬의 행)을 의미각각의 index가 무엇을 의미해야 하는지가 헷갈려서 많이 헤맸지만 결국 혼자 해냈다!
function solution(arr1, arr2) {
let answer = [];
for(let i=0;i<arr1.length;i++){
answer.push([]);
for(let j=0;j<arr2[0].length;j++){
let n = 0;
for(let k=0;k<arr1[i].length;k++){
n += arr1[i][k] * arr2[k][j];
}
answer[i].push(n);
}
}
return answer;
}
map을 써서 풀면 좀 더 깔끔하게 풀 수 있다.
function productMatrix(A, B) {
return A.map(function(row) {
return row.map(function(_, i) {
return row.reduce(function(sum, cell, j) {
return sum + cell * B[j][i];
}, 0);
});
});
}