본문 바로가기
코딩테스트 연습/프로그래머스

[Python] 프로그래머스 (행렬의 곱셉)

by Lagooni 2021. 9. 29.

문제 설명

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

문제풀이

  • 1. numpy사용
    • import numpy as np
      
      def solution(arr1, arr2):
          answer = [[]]
          a1 = np.array(arr1)
          a2 = np.array(arr2)
          answer = a1.dot(a2)
          return answer.tolist()
  • 2. 3중 for문
    • def solution1(arr1, arr2):
          answer = []
          for i in range(len(arr1)):
              answer.append([])
              for j in range(len(arr2[0])):
                  sum = 0
                  for k in range(len(arr1[0])):
                      sum += arr1[i][k] * arr2[k][j]
                  answer[i].append(sum)
          return answer
  • 3. zip(*)사용
def solution(A, B):
    answer = []
    c = 0
    for i in A:
        answer.append([])
        for j in zip(*B):
            sum = 0
            for a,b in zip(i,j):
                sum += a*b
            answer[c].append(sum)
        c = c + 1
    return answer
  • 4. 축약
  • 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]


numpy를 사용하면 매우 간단하게 문제를 풀 수 있었다.

하지만 파이썬 표준 라이브러리에 포함되지 않아 코딩테스트를 위한 풀이에 적합하지 않을 수 있어 다른 방법으로도 풀어 보았다.

zip()에 *을 사용하면 리스트의 원소를 개별적인 입력인자로 만들어주는 역할을 한다. 알아두면 자주 쓰일듯

 

댓글