Level 2 ) 행렬의 곱셈 ⭐️

Doozuu·2023년 4월 3일
0

프로그래머스 (JS)

목록 보기
104/183

문제 설명

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]]

분석

행렬의 곱

첫 번째 행렬(A)의 행과 두 번째 행렬(B)의 열을 곱해 새로운 행렬을 만든다.

예시

A = [ a11  a12 ]
    [ a21  a22 ]
B = [ b11  b12 ]
    [ b21  b22 ]
AB = [ a11*b11 + a12*b21   a11*b12 + a12*b22 ]
     [ a21*b11 + a22*b21   a21*b12 + a22*b22 ]

풀이

  1. 전체 행렬을 담을 배열을 하나 만든다.
  2. 삼중 배열을 이용해 행렬의 곱을 구한다.
    • i : 첫 번째 행렬의 행을 의미
    • j : 두 번째 행렬의 열을 의미
    • k : 첫 번째 행렬의 열(= 두 번재 행렬의 행)을 의미
  3. 곱을 순서대로 담는다.

각각의 index가 무엇을 의미해야 하는지가 헷갈려서 많이 헤맸지만 결국 혼자 해냈다!

function solution(arr1, arr2) {
    let answer = [];
    for(let i=0;i<arr1.length;i++){
        answer.push([]);
        for(let j=0;j<arr2[0].length;j++){
             let n = 0;
             for(let k=0;k<arr1[i].length;k++){
                n += arr1[i][k] * arr2[k][j];
             }
             answer[i].push(n);
        }
    }
    return answer;
}

다른 풀이

map을 써서 풀면 좀 더 깔끔하게 풀 수 있다.

function productMatrix(A, B) {
    return A.map(function(row) {
        return row.map(function(_, i) {
            return row.reduce(function(sum, cell, j) {
                return sum + cell * B[j][i];
            }, 0);
        });
    });
}
profile
모든게 새롭고 재밌는 프론트엔드 새싹

0개의 댓글