본문 바로가기
기초다지기/JS 코딩테스트

javaScript 두 행렬 곱하기

by 김빵그 2024. 1. 8.

 

문제 

행렬 곱셈 값 구하기

풀이 

function solution(arr1, arr2) {
    const answer = []
    for(let i = 0; i < arr1.length; i++){
        const rows = []
        for(let j = 0; j < arr2[0].length; j++){
            let sum = 0
            for(let k = 0; k <arr1[i].length; k++){
                sum += arr1[i][k] * arr2[k][j]
            }
            rows.push(sum)
        }
        answer.push(rows)
    }
    return answer
}
  • answer : 최공 결과 행렬을 담을 빈 배열 선언 
  • for i 
    • arr1에 대한 각 행에 대해 반복
    • row : 결과 행렬의 한 행을 담을 배열
  • for j 
    • arr2에 대한 각 열에 대해 반복
    • 행렬 곱셈 수행 : arr1의 i번째행과 arr2의 j 번째 열을 곱하고 합산
  • rows 배열을 answer에 추가

 

다른 풀이

function multiplyMatrices(arr1, arr2) {
    // arr1의 각 행에 대해 map을 사용하여 새로운 배열을 생성
    return arr1.map((row) =>
        // arr2[0]의 각 열에 대해 map을 사용하여 행렬 곱셈 수행
        arr2[0].map((_, y) =>
            // 현재 위치의 결과 행렬의 원소 계산
            row.reduce((sum, val, c) =>
                sum + val * arr2[c][y], 0)
        )
    );
}
  • arr2.map(_, y) 
    • _는 현재 값이 필요하지 않음을 나타내고 y는 현재 열의 인덱스
  • reduce 
    • 현재 위치의 결과 행렬의 원소 계산
    • sum 은 누적된 값으로 초기값 0 
    • c는 현재 요소 인덱스
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);
        });
    });
}