1. 문제 설명
- 2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
2. 제한 조건
- 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
- 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
- 곱할 수 있는 배열만 주어집니다.
3. 입출력 예
let output = solution([[1, 4], [3, 2], [4, 1]], [[3, 3], [3, 3]]);
console.log(output); // [[15, 15], [15, 15], [15, 15]]
output = solution([[2, 3, 2], [4, 2, 4], [3, 1, 4]], [[5, 4, 3], [2, 4, 1], [3, 1, 1]]);
console.log(output); // [[22, 22, 11], [36, 28, 18], [29, 20, 14]]
4. 문제 풀이
function solution(arr1, arr2) {
const result = arr1.map((_, rowIdx, org) => {
return arr2[0].map((_, colIdx) => {
return org[rowIdx].reduce((acc, curr, currIdx) => {
return acc += curr * arr2[currIdx][colIdx];
}, 0);
});
});
return result;
};
5. 문제 풀이 해설
function solution(arr1, arr2) {
// 분석
// 행렬의 곱셉법에 대해 알아야한다.
// arr1의 첫번째 행과 arr2의 첫번째 열값들만 곱해서 합산한 값이
// 새로운 배열의 [0][0]의 값이 된다. [0][1]의 값은
// arr1 첫번째 행과 arr2의 두번째 열값들만 곱해서 합산한 값이다.
// 이런 식으로 쭉 연산한 결과 배열을 반환해주면된다.
// 기본적으로 반복문을 3개를 중첩시키면 어렵지 않게 풀릴 수 있는 문제이다.
// 1) arr1의 행과, result의 행을 순회할 반복문
// 2) arr1의 열과, arr2의 행을 순회할 반복문
// 3) arr2의 열과, result의 열을 순회할 반복문 까지 총 3개인 셈이다.
// 풀이 - 배열 메소드를 활용
// 배열 메소드에 대한 이해가 부족하면 시도하기 어려운 방식일 수 있다.
// 1. arr1의 행길이가 결과배열의 행길이와 같으므로 먼저 map을 실행한다.
// 2. 두 번째로는 arr2의 요소에도 map을 주어 접근해준다.
// arr2의 열길이가 결과배열의 열길이와 같을 것이기 때문이다.
// 3. map안에서 reduce를 반복하여 2차원배열에 값을 누적해가면 된다.
// arr1를 reduce의 기준으로 삼고, arr2는 인덱스로 접근을 하면 된다.
// 4. 반환흐름: 리듀스에서 산출된 값은 두번째 맵에서 배열의 형태로 갖춰지고,
// 그 결과는 또 다시 첫번째 맵을 통해 배열 안에 배열의 형태로 누적이 된다.
const result = arr1.map((_, rIdx, org) => {
return arr2[0].map((_, cIdx) => {
return org[rIdx].reduce((acc, curr, curIdx) => {
return acc += curr * arr2[curIdx][cIdx];
}, 0);
});
});
return result;
};