[프로그래머스 / level2] 행렬의 곱셈

EJ·2020년 11월 27일
0

Algorithm

목록 보기
5/11
post-thumbnail

문제 설명

2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.


제한 조건

  • 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
  • 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
  • 곱할 수 있는 배열만 주어집니다.

입출력 예

arr1arr2return
[[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)))
}
profile
주니어 프론트엔드 개발자 👼🏻

0개의 댓글