2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
- 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
- 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
- 곱할 수 있는 배열만 주어집니다.
function solution(arr1, arr2) {
let answer = [];
for (let i = 0; i < arr1.length; i++) {
let result = [];
for (let j = 0; j < arr2.length; j++) {
let sum = 0;
for (let k = 0; k < arr2[j].length; k++) {
sum += arr1[i][k] * arr2[k][j];
}
result.push(sum);
}
answer.push(result);
}
return answer;
}
문제가 이해가 안되어서 푸는데 시간이 조금 걸렸다.🥲 행렬의 곱셈이 기억이 나지 않는 분들은 이 링크를 한번 보고 다시 문제를 살펴보자!
arr1의 1행과 arr2의 1행을 곱하는게 아니라 arr1의 1행과 arr2의 각행의 index 0번 원소들과 곱하는 식으로 접근을 해야한다.
혹시 위와 같이 구현했다면 아래의 반례를 넣어보자!
arr 1: [[2, 3, 2],[4, 2, 4],[3, 1, 4]]
arr2: [[5, 4],[2, 4],[3, 1]]
만약 위의 반례를 넣었을 때 왜 작동이 되지 않는지 이해가 되지 않는다면 아래의 설명을 보자.
function solution(arr1, arr2) {
var answer = [];
for (let i = 0; i < arr1.length; i++) {
let result = [];
for (let j = 0; j < arr2[0].length; j++) {
let sum = 0;
for (let k = 0; k < arr1[i].length; k++) {
sum += arr1[i][k] * arr2[k][j];
}
result.push(sum);
}
answer.push(result);
}
return answer;
}
행렬의 곱셈을 차근히 곱씹어보자. arr1의 1행과 arr2의 각 행의 첫번째 원소들을 각각 일치 시켜 곱하는 형태이다. arr1의 1행의 첫번째 원소 x arr2의 1행의 첫번째 원소, arr1의 1행의 두번째 원소 x arr2의 2행의 첫번째 원소 ... 이런 형태이다. 결국 값들을 계산해주기 위해서는 3중 for문을 사용해야한다.
1. 첫번째 for문에서는 arr1의 행의 길이를 반복해준다.
2. 두번째 for문에서는 arr2의 0번째 index를 지닌 행의 길이를 반복해준다. 여기서 0을 넣어주는 이유는 arr2의 길이가 아닌 arr2의 각 행의 길이가 필요하기 때문이다. 만약 [[5, 4],[2, 4],[3, 1]] 과 같은 행렬이 주어졌을 시 arr2의 길이는 3이지만 arr2의 각각 원소의 길이는 2이기 때문에 우리는 각 원소의 길이인 2가 필요하다. 제한 조건에 행과 열의 길이는 2 이상이라고 했기 때문에 무조건 배열이 하나는 있을 것이라 가정하고 0을 넣어준다.
3. 마지막 for문에서는 계산을 진행한다. arr1의 해당 행에서 원소의 길이만큼 반복해주면서 계산을 한다. 행렬의 곱셈이 성립하려면 ixk배열과 kxj 배열의 계산만 가능하다. 즉 첫번째 배열의 행과 두번째 배열의 열이 같아야 계산이 성립한다. 따라서 arr1[i][k] 와 arr2[k][j] 를 계산해줄 수 있다.