[Programmers] 행렬의 곱셈
Updated:
행렬의 곱셈
행렬의 곱셈 을 클릭하면 바로 이동한다.
수학에서 정의한 행렬의 곱셈을 구현하면 된다.
처음엔 numpy 를 이용해서 만들었는데 numpy 는 파이썬이 기본으로 제공하는 라이브러리가 아니라
코딩테스트 때 사용 할 수 없다고 한다.
import numpy as np
def solution(arr1, arr2):
result = []
for cur in list(np.dot(arr1, arr2)):
result.append(list(cur))
return result
def solution(arr1, arr2):
spin_arr2 = []
result = []
for i in range(len(arr2[0])):
tmp = []
for j in range(len(arr2)):
tmp.append(arr2[j][i])
spin_arr2.append(tmp)
for cur1 in arr1:
tmp = []
for cur2 in spin_arr2:
tmp_val = 0
for val1, val2 in zip(cur1, cur2):
tmp_val += val1 * val2
tmp.append(tmp_val)
result.append(tmp)
return result
첫번째 반복문을 통해 두 번째 배열의 행, 열 을 서로 바꾸었다.
그리고 일반적인 행렬의 곱을 구현했다.
하지만.. 다른 사람의 풀이를 보니 엄청난 코드가 있었다.
나는 zip 함수를 단순히 길이가 같은 두 개 이상의 리스트를 동시에 순회 할 때 사용하는 줄로만 알고 있었다.
그런데 arr2 를 unpacking 한 뒤 zip 으로 묶으면 행, 열이 바뀐 결과가 나온다.
zip 은 김밥을 썬다고 생각하면 된다. 길이가 같은 김밥을 종대로 놓고 자르는 것이다.
2차원 배열을 김밥 썰듯이 썬다 ! 그렇게 된다면 행과 열이 바뀐 상태로 반환된다.
def solution(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]
Leave a comment