Programmers Coding Quiz #30 행렬의 곱셈

문제 설명

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

풀이

import numpy as np

def solution(arr1, arr2):
    result = np.mat(arr1) * np.mat(arr2)
    return result.tolist()
  1. np.array로 반환된 값을 그대로 곱셈하면 일반적인 행렬연산이 아니라 단순히 리스트 간 위상이 같은 요소들끼리만 곱합니다 예컨데 [[2,2],[3,3]] 과 [[1,2],[3,1]]의 결과값은 [[2,4],[9,3]]이 됩니다. 실제 행렬곱의 결과인 [[8,6],[12,9]]과는 다른 결과가 나오죠
  2. np.matrix(=np.mat)으로 변환한 matrix인자는 곱셈연산을 하면 원하는 결과값이 나옵니다.
  3. 반환된 결과값을 tolist()라는 numpy메서드로 변경해주면 리스트 형태로 반환됩니다.

다른풀이

def productMatrix(A, B):
    return [[sum(a*b for a, b in zip(A_row,B_col)) for B_col in zip(*B)] for A_row in A]

zip()은 보통 for문과 함께 같은 길이의 리스트를 순회할 때 많이씁니다. 하지만 여기서는 zip()특성을 활용해 B의 열을 구해낼 수 있습니다.

만약 arr1이 [[1, 4], [3, 2], [4, 1]]일 때 zip(*arr1)을 쓰면 리스트 세 개의 같은 인덱스에 있는 요소끼리 묶이게 됩니다. 그러므로 [(1,3,4),(4,2,1)]이 됩니다. 이런식으로 zip을 활용해 행렬곱연산을 구현할 수 있습니다. numpy같은 치트키를 쓰지않아도 내장 함수로 1줄코딩을 할 수 있는 멋진 풀이였습니다.

좋은 웹페이지 즐겨찾기