[programmers] 행렬의 곱셈
문제 설명
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
제한사항
행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
곱할 수 있는 배열만 주어집니다.
Idea
현재 DACON, kaggle문제를 풀고 있는 사람으로써 이문제를 cheatting으로 바로 풀어버렸다..
import numpy as np
def solution(arr1, arr2):
return np.dot(arr1, arr2).tolist()
물론 이렇게 푸는게 공부는 당연히 안된다. 그래서 product을 구현해보았다.
문제에서 요구하는것은 2차원, 그러니까 matrix product를 구현하라는것.
image address : here
Code
def solution(arr1, arr2):
return [[sum(a*b for a,b in zip(X_row,Y_col)) for Y_col in zip(*arr2)] for X_row in arr1]
Explain
위의 코드는 압축형 코드이고, 풀어쓰면 다시 아래와 같이 쓸수있다.
def solution(arr1, arr2):
answer = list()
for X_row in arr1:
row_result = list()
for Y_col in zip(*arr2):
# zip(*arr2)는 [i[0] for i in arr2]와 같은 코드다.
temp = 0
for a,b in zip(X_row, Y_col):
temp += a*b
row_result.append(temp)
answer.append(row_result)
return answer
위의 코드에서는 인덱스 접근을 하지않고, 원소 하나씩 했지만, 인덱스 접근을 하면 answer코드만
answer = [[0 for j in range(len(arr2[0])) ] for i in range(len(arr1))]
이런식으로 바꾸고 loop도 적절하게 수정하면 되겠다.
여기서 제일 중요한거는 실행시간인데, np.dot()이 40배정도 빨랐다 ㅋㅋ
댓글남기기