본문 바로가기
코딩 테스트/알고리즘

알고리즘 88번 : 행렬의 곱셈 - js

by GREEN나무 2025. 4. 17.
728x90

URL : https://school.programmers.co.kr/learn/courses/30/lessons/12949

문제

더보기

문제 설명

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

제한 조건

행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.

행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.

곱할 수 있는 배열만 주어집니다.

입출력 예

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

  JS

계획

 

반복문 돌리기 - 3회

1. arr1의 행의 개수

2. 곱한 값 더하기 

3. arr2의 행의 개수(= arr1 각 행의 열 개수)만큼 반복하면서 행렬을 곱하기


참고, 풀이

 


function solution(arr1, arr2) {
    var answer = [];

    // arr1의 행의 수
    for (let i = 0; i < arr1.length; i++) {
        const row = [];
        // arr2의 열의 수

        for (let j = 0; j < arr2[0].length; j++) {
            let sum = 0;
            //내적 계산
            for (let k = 0; k < arr1[0].length; k++) {
                sum += arr1[i][k] * arr2[k][j];
            }
            row.push(sum);
        }
        answer.push(row);
    }
    return answer;
}

코드 간략화하기

function solution(arr1, arr2) {
    return arr1.map((row, i) =>
        arr2[0].map((_, j) =>
            row.reduce((sum, val, k) => sum + val * arr2[k][j], 0)
        )
    );
}

참고

행렬의 곱셈 : https://mathbang.net/562#google_vignette