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

JH.P·2022년 7월 19일

행렬 곱셈

  • 두 행렬을 곱한 결과를 반환하는 문제이다.
  • 행렬에 관한 사전 지식이 어느 정도 필요한 문제이다.

행렬 곱 조건, 곱셈 결과 형태

  • 우선 두 행렬의 곱셈이 가능하려면 첫번째 행렬의 열 갯수와 두번째 행렬의 행 갯수가 같아야 한다.
    • ex) 2 x 3 행렬은 3 x 5 행렬과 곱 연산이 가능하다.
    • 해당 두 행렬의 곱셈 결과는 2 * 5 행렬이다.

행렬 곱셈 과정

  • 위 조건처럼 곱셈 연산이 가능한 두 행렬이 있다고 하자.
    3 x 2
    [[1, 4],
    [3, 2],
    [4, 1]]

    2 x 2
    [[3, 3],
    [3, 3]]

이 두 행렬의 곱셈이 완료된 결과물은 아래와 같을 것이다.
3 x 2
[[0, 0],
[0, 0],
[0, 0]

해당 문제를 풀기 위해 선형 대 수학의 지식이 필요하다.
곱셈의 과정은 다음과 같다.
먼저 1행 1열의 값을 구하려면,

  • 첫 번쨰 행렬의 1행 내 첫 요소부터 끝 요소까지, 두 번째 행렬의 1열의 첫 요소부터 끝 요소까지 각각 요소를 짝에 맞춰서 곱하고 더하는 값이 된다.
    같은 방법으로 1행 2열의 값을 구하려면
  • 첫 번째 행렬의 1행 내 첫 요소부터 끝 요소까지, 두 번째 행렬의 2열의 첫 요소부터 끝 요소까지 각각 요소를 짝에 맞춰서 곱하고 더한다.

코드

function solution(arr1, arr2) {
  
    let result = Array(arr1.length).fill(0).map(row => Array(arr2[0].length).fill(0))
    
    for(let i = 0; i < arr1.length; i++) {        // 행의 길이만큼 반복
        for(let j = 0; j < arr2[0].length; j++) {     // 열의 길이만큼 반복
            let sum = 0
            for(let k = 0; k < arr1[i].length; k++) {
                sum = sum + (arr1[i][k] * arr2[k][j]) 
            }
            result[i][j] = sum
        }
    }
    return result
}

따라서 코드로 구현하면 위와 같다. 과정을 간략하게 살펴보면

  • 먼저 행렬의 결과물 뼈대를 만들고 0으로 채운다.
  • 뼈대의 내용을 채우려면, 행 내 열 요소들까지 전부 순회해야하므로 2중 for loop을 시행한다.
  • 각각의 요소에서는 위 곱셈 과정을 구현하기 위해, 첫 번째 행렬의 해당 행 내 첫 요소부터 끝요소까지, 그리고 두 번째 행렬의 해당 열 내 첫요소부터 끝 요소까지를 짝에 맞춰서 곱하고 합한다.
profile
꾸준한 기록

0개의 댓글