2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
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]] |
테스트케이스추가 | ------ | ----- |
[[1, 2, 3], [4, 5, 6]] | [[1, 4], [2, 5], [3, 6]] | [[14, 32], [32, 77]] |
function solution(arr1, arr2) { var answer = []; // arr1과 arr2 배열의 길이가 다를 경우를 생각해줘야 한다. // 따라서 arr2의 length를 for문의 조건으로 줄 때, arr2의 속성하나를 선택해줘야 arr1의 길이가 더 길 경우 에러 안난다. // 난 처음에 arr2.length로 조건을 줬었다. 이렇게 하니까 arr1배열의 속성이 3개고 이 속성의 객체가 3개이면서, arr2의 속성이 3개고 이 속성의 개체가 2개일 경우 숫자가 맞지 않아 에러가 났었다. // 테스트3번을 돌린 결과 arr2[k][j]를 계산할 때 j의 값이 2가 나와야하는데 3이 나왔으니 에러날수밖에!! for(let i = 0; i < arr1.length; i++) { let multiArr = []; for(let j = 0; j < arr2[0].length; j++) { let multiply = 0; // for(let k = 0; k < arr1[i].length; k++) { let count = 0; arr1[i].forEach(arr11 => { multiply += arr11 * arr2[count][j] count++; }) // multiply += arr1[i][k] * arr2[k][j]; // } multiArr.push(multiply); } answer.push(multiArr); } // arr1.forEach(arr11 => { // let count = 0; // let multiArr = []; // while(count < arr11.length) { // let multiply = 0; // for(let j = 0; j < arr2.length; j++) { // multiply += (arr11[count] * arr2[count][j]); // } // count++; // multiArr.push(multiply); // } // answer.push(multiArr); // }); return answer; }
- 행렬의 곱셈 문제를 처음에 이해하는데 시간이 좀 걸렸다.😢
- 행렬의 곱셈을 구하기 위해서는 1번 행렬에 들어있는 첫 번째 배열의 객체들과 2번 행렬에 들어있는 배열들의 첫 번째 값을 순서대로 곱해서 더해줘야한다.(말로 적으니까 못알아듣겠네..ㅎㅎ)
- 예를 첫 번째로 들었지만, 두 번째, 세 번째도 마찬가지이다.
- for문과 forEach문을 이용해 3겹이 되는 반복문을 돌리느라 코드를 작성하면서 내가 헷갈렸다.ㅎ_ㅎ
2단계 문제들 중에서 그나마 접근이 쉬워보였는데 나에겐 어려웠다.🥺
(8점)
function solution(arr1, arr2) { return Array(arr1.length).fill().map((r, i) => Array(arr2[0].length).fill().map((v, j) => arr1[i].reduce((a, c, k) => a + c * arr2[k][j], 0))) }