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

butterbeetle·2023년 4월 16일
0

코딩테스트

목록 보기
105/132
post-thumbnail

문제설명

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

내 풀이

function solution(A, B) {
    const answer = [];
    
    for(let i=0; i<A.length; i++){
        const tmp = [];
        for(let j=0; j<B[0].length; j++){
            let sum = 0;
            for(let k=0; k<A[0].length; k++){
                sum += (A[i][k] * B[k][j]);
            }
            tmp.push(sum);
        }
        answer.push(tmp)
    }
    
    return answer
}

문제 자체는 누구라도 만나본 행렬의 곱셈이다.

기억에 의존해서 처음에는 2중 for문을 각 배열의 길이만큼 반복해서 풀려고 했는데 도무지 풀리질 않았다..
곱셈
그래서 곱셈에 대해서 인터넷을 찾아보고 여기에서 이해하기 좋은 그림을 발견해서 보면서 다시 풀이를 시작했다.

간략하게 글로 적어보자면

01
(A[0][0]xB[0][0]) + (A[0][1]xB[1][0])(A[0][0]xB[0][1]) + (A[0][1]xB[1][1])
(A[1][0]xB[0][0]) + (A[1][1]xB[1][0])(A[1][0]xB[0][1]) + (A[1][1]xB[1][1])
(A[2][0]xB[0][0]) + (A[2][1]xB[1][0])(A[2][0]xB[0][1]) + (A[2][1]xB[1][1])
......

이런식으로 계산이 이루어져야 한다.
즉,
i 전체적으로 A의 행의 길이만큼 반복이 있어야 하고
k A의 열만큼 반복 하는걸
j B의 열만큼 반복 해야한다.


사실 너무 헷갈려서 오랜만에 그림 그리면서 풀었다..
쉬울줄 알고 후딱풀고 딴것도 해야지 했는데 Lv.2인 이유가 있었다.

profile
멍청이

0개의 댓글