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],
function solution(A, B) {
const answer = [];
for(let i=0; i<A.length; i++){
const tmp = [];
for(let j=0; j<B[0].length; j++){
let sum = 0;
for(let k=0; k<A[0].length; k++){
sum += (A[i][k] * B[k][j]);
}
tmp.push(sum);
}
answer.push(tmp)
}
return answer
}
문제 자체는 누구라도 만나본 행렬의 곱셈이다.
기억에 의존해서 처음에는 2중 for문을 각 배열의 길이만큼 반복해서 풀려고 했는데 도무지 풀리질 않았다..
그래서 곱셈에 대해서 인터넷을 찾아보고 여기에서 이해하기 좋은 그림을 발견해서 보면서 다시 풀이를 시작했다.
간략하게 글로 적어보자면
0 | 1 |
---|---|
(A[0][0]xB[0][0]) + (A[0][1]xB[1][0]) | (A[0][0]xB[0][1]) + (A[0][1]xB[1][1]) |
(A[1][0]xB[0][0]) + (A[1][1]xB[1][0]) | (A[1][0]xB[0][1]) + (A[1][1]xB[1][1]) |
(A[2][0]xB[0][0]) + (A[2][1]xB[1][0]) | (A[2][0]xB[0][1]) + (A[2][1]xB[1][1]) |
... | ... |
이런식으로 계산이 이루어져야 한다.
즉,
i
전체적으로 A의 행의 길이만큼 반복이 있어야 하고
k
A의 열만큼 반복 하는걸
j
B의 열만큼 반복 해야한다.
사실 너무 헷갈려서 오랜만에 그림 그리면서 풀었다..
쉬울줄 알고 후딱풀고 딴것도 해야지 했는데 Lv.2인 이유가 있었다.