프로그래머스 - 행렬의 곱셈

Lellow_Mellow·2023년 5월 22일
1
post-thumbnail

✨ Lv. 2 - 행렬의 곱셈

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12949

문제 설명

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


제한사항

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

풀이 코드 + 설명

우선 행렬의 곱셈 방식에 대해서 알아봅시다. 행렬의 곱셈은 아래와 같이 계산합니다.

앞 행렬을 A, 뒷 행렬을 B라 했을 때, Ai행과 Bj열을 각각 곱하여 더한 값이 새로운 행렬의 (i, j) 값이 됩니다. 이를 바탕으로 아래와 같이 코드를 작성하였습니다.

function solution(arr1, arr2) {
    let result = Array.from({length: arr1.length}, () => []);
    for(let i = 0; i < arr1.length; i++) {
        for(let j = 0; j < arr2[0].length; j++) {
            let current = arr1[i].reduce((s, v, idx) => s + (v * arr2[idx][j]), 0);
            result[i].push(current);
        }
    }
    return result;
}

행렬의 곱셈의 결과는 A 행렬이 m x k, B 행렬이 k x n일 경우에 m x n 행렬이 됩니다. 따라서 m개의 행을 가지고 있는 빈 배열을 생성하였습니다. 이후 행렬 곱셈의 규칙에 따라 행렬 곱셈의 결과값을 return 하였습니다.

이를 mapreduce를 활용하여 아래와 같이 간단하게 작성할 수 있습니다.

function solution(arr1, arr2) {
    return arr1.map((row) => {
        return arr2[0].map((_, i) => {
            return row.reduce((s, v, idx) => s + v * arr2[idx][i], 0);
        })
    })
}

profile
잔잔한 물결에서 파도로, 도약을 위한 도전. 함께하는 성장

0개의 댓글