안녕하세요

프로그래머스 JS [행렬의 곱셈] 본문

프로그래머스/Lv.2

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

sakuraop 2022. 11. 27. 12:52
  • 행렬의 곱셈
문제 설명

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

행렬의 곱셈 방법

a1 b1 c1   ㄱ1 ㄱ2
a2 b2 c2 X ㄴ1 ㄴ2
        ㄷ1 ㄷ2

🔻

a1ㄱ1 + b1ㄴ1 + c1ㄷ1 a1ㄱ2 + b1ㄴ2 + c1ㄷ2
a2ㄱ2 + b2ㄴ2 + c3ㄷ2 a2ㄱ2 + b2ㄴ2 + c2ㄷ2

3x2 행렬 * 2x3 행렬 =>  2x2 행렬

for (let j = 0; j < arr2[0].length; j++) {
두번째 for 문에서 처음에는 arr2.length로 설정했을 때 test를 통과했지만
실제 제출할 때는 모든 문제에서 실패했다.

원인은 테스트에서 주어지는 행렬은 정사각형 형태로
arr2.length와 arr2[0].length가 항상 같기 떄문이었다.
function solution(arr1, arr2) {
    var answer = [];

    for (let i = 0; i < arr1.length; i++) {
        const answerArray = [];
        for (let j = 0; j < arr2[0].length; j++) {
            let element = 0;
            for (let k = 0; k < arr2.length; k++) {
                element += arr1[i][k] * arr2[k][j];
            }
            answerArray.push(element);
        }
        answer.push(answerArray);
    }

    return answer;
}

solution(
    [
        [1, 4],
        [3, 2],
        [4, 1],
    ],
    [
        [3, 3],
        [3, 3],
    ]
);
 
// 1 4 | 3 3 => 15 | 15
// 3 2 | 3 3 => 15 | 15
// 4 1 |     => 15 | 15