규도자 개발 블로그

[프로그래머스/Level2/파이썬3(python3)] 행렬의 곱셈 본문

알고리즘/풀이

[프로그래머스/Level2/파이썬3(python3)] 행렬의 곱셈

규도자 (gyudoza) 2021. 3. 28. 20:29

[프로그래머스/Level2/파이썬3(python3)] 행렬의 곱셈

문제

2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, 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]]

풀이

def solution(arr1, arr2):
    x = len(arr2[0])
    y = len(arr1)
    answer = []
    for i in range(y):
        x_list = []
        for j in range(x):
            number = 0
            for k in range(len(arr1[0])):
                nf1 = arr1[i][k]
                nf2 = arr2[k][j]
                number += nf1 * nf2
            x_list.append(number)
        answer.append(x_list)
    return answer

설명

일단 이 문제를 풀기 위해선 행렬과 행렬의 곱셈에 대해서 알아야 한다. 행렬은 컴퓨터에서 쓰이는 list가 아니라 수학 개념 중 하나이다. 수 또는 다항식 등을 직사각형 모양으로 배열한 것을 행렬이라고 하는데 또 이를 곱하는 것에는 행렬의 곱셈이라는 특수한 방식이 요구된다.

{\displaystyle {\begin{pmatrix}1&0&2\\-1&3&1\\\end{pmatrix}}{\begin{pmatrix}3&1\\2&1\\1&0\end{pmatrix}}={\begin{pmatrix}1\cdot 3+0\cdot 2+2\cdot 1&1\cdot 1+0\cdot 1+2\cdot 0\\-1\cdot 3+3\cdot 2+1\cdot 1&-1\cdot 1+3\cdot 1+1\cdot 0\end{pmatrix}}={\begin{pmatrix}5&1\\4&2\end{pmatrix}}}

이러한 형태로 정의할 수 있다. 이곳을 참고하면 쉽게 이해할 수 있을 것이다. 오히려 코드로 이해하는 게 개발자들에겐 좀 더 직관적인 방법일 수도 있다는 생각이 든다. 완성된 행렬의 x(열)의 길이는 arr2의 열 길이이고, 완성된 행렬의 y(행)의 길이는 arr1의 행 길이이다. 그런고로 행렬의 곱셈을 완성하기 위해선 arr1의 열길이와 arr2의 행길이가 일치해야 한다. 행렬을 곱하는 공식을 for문을 이용하여 간단하게 구현했다.

Comments