2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
행렬의 곱셈 문제이다. 펜으로 문제를 푸는 것은 금방 걸리지만 막상 이것을 코드로 구현하고자 하니 할 일이 태산이었다. 감조차 잡히지 않았다. 우선 for문
을 사용하는 것은 알았지만 어떻게 변수를 잡아야할 지 모르겠었다.
이런 문제를 풀 때에는 주어진 테스트 케이스를 실제로 손으로 하나씩 해결해나가며 변수를 무엇으로 설정할 지 계산하는 것이 중요하다. for문을 3번 적용하여 우선 arr1의 열을 순차적으로 계산하고, arr1의 행만큼 또 순차적으로 계산하고, 마지막으로 arr2의 열만큼 계산하면 어느정도 해결이 될 것 같았다. 또한 삼중 배열 내에서 구한 값을 하나의 j문에서 더해서 배열에 추가하고 또 그 배열을 최종 배열에 추가해줘야 문제가 해결되었다.
테스트 케이스는 해결이 되어서 아무 문제없이 제출했는데 정답률 0%가 나와버렸다. 무엇이 문제인지 모르겠어서 다시한번 테스트 케이스를 풀어봤는데 감이 안잡혔다. 질문하기에서 예시로 테스트 케이스 하나를 주셔서 넣어봤는데 배열 끝자리에 NULL이 떴다. 생각해보니 j문에서 arr1[0].length
만큼 계산했는데 그 개수가 arr1의 행이 아닌 arr2의 행만큼 해야 필요한 연산만 할 수 있었다.
function solution(arr1, arr2) {
let result = []; // 최종 제출 배열
let arr = []; // 행렬 한 행을 담는 배열
let sum = 0; // 행X열 값을 더해서 배열에 추가
// i는 arr1의 열 개수만큼
for(let i=0; i<arr1.length; i++){
// j는 arr1의 행과 arr2의 열 개수만큼
for(let j=0; j<arr2[0].length; j++){
sum = 0;
// k는 arr2의 열 개수만큼
for(let k=0; k<arr2.length; k++){
sum += arr1[i][k] * arr2[k][j];
}
arr.push(sum); // k에서 한번 순회할 때 값 모두 sum한 것
}
result.push(arr); // 최종 배열에 배열 넣기
arr = []; // arr을 초기화해서 새로운 더한 값 집어 넣기
}
return result;
}