728x90
반응형
행렬의 곱셈
❓ 문제설명
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]] |
💡 풀이
function solution(arr1, arr2) {
// 내풀이
// arr1[0][0] 은 arr2[0][0] / arr2[0][1] 과 곱해져 각 answer[0][0] / answer[0][1] 에 더해진다.
// 이런식으로 arr1의 각 요소를 돌면서 연산을 실행하여 answer의 각 위치에 더해준다.
const answer = Array.from(Array(arr1.length), () => Array(arr2[0].length).fill(0))
arr1.forEach((row, i) => {
row.forEach((col, j) => {
for (let k=0; k < arr2[j].length; k++) {
answer[i][k] += col * arr2[j][k]
}
})
})
return answer
// 다른사람 풀이 참고
// 내 풀이와 동일한 방식이지만 map과 reduce를 통해 바로 리턴
return arr1.map((row) => arr2[0].map((x,y) => row.reduce((a,b,c) => a + b * arr2[c][y], 0)))
}
📝 해설
n1 x m1 을 arr1 / n2 x m2 을 arr2 라 하였을 때 return 은 n1 x m2 배열이 된다. 또한, return 의 [row, col] 의 값은 arr1[row, 0] * arr2[0, col] + ... + arr1[row, m1 -1] * arr2[n2 -1, col] 이 된다.
arr1 의 모든원소를 돌며 그와 대응되는 arr2 의 값과 곱한 후 해당 값이 더해질 return 에서의 좌표에 계속 더해주면 return 배열이 완성되고 이를 출력하였다.
📚 참고자료
- https://kimby.tistory.com/48 (Array 메소드)
728x90
반응형