프로그래머스 Lv2 문제입니다. 실전에 대비하기 위해 60분 시간제한을 두고 풀었습니다.
문제
https://school.programmers.co.kr/learn/courses/30/lessons/12949
[나의 풀이]
⌛ 40분 소요
def solution(arr1, arr2):
answer = []
transposed_arr2 = []
for col in range(len(arr2[0])):
new_row = []
for row in range(len(arr2)):
new_row.append(arr2[row][col])
transposed_arr2.append(new_row)
for v1 in arr1:
tmp = []
for v2 in transposed_arr2:
tmp.append(sum([x*y for x,y in zip(v1,v2)]))
answer.append(tmp)
return answer
행렬 연산 문제입니다. 두가지 행렬이 주어집니다. 이때, 한가지 행렬을 transpose 변환한 뒤 한 행씩 각 요소별 곱의 합을 연산하는 방식입니다. 두 리스트에서 인덱스에 맞는 두 요소를 곱하고 합하기 위해 zip()함수로 묶어 표현하였습니다.
[다른 사람의 풀이1]
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]
'나의 풀이'와 같은 연산방식이되 list comprehension을 통해 간결히 구현한 방식입니다. '나의 풀이'에서는 한 리스트를 transpose하여 저장하였다면 위 풀이는
for B_col in zip(*B)
로 표현하여 transpose 시키고 바로 연산하는 방식이였습니다. zip(*리스트) 와 같은 코드는 처음 보는 형태로 재밌는(?) 포인트였습니다.
[다른 사람의 풀이2]
def productMatrix(A, B):
answer = []
for i in range(len(A)):
arr = []
for j in range(len(B[0])):
tmp = 0
for k in range(len(A[0])):
tmp += A[i][k] * B[k][j]
arr.append(tmp)
answer.append(arr)
return answer
또 다른 풀이로 직관적인 3중 for문으로 구현한 방식입니다. 행렬곱의 특성상 예를 들어 차원이, 2x2 * 2x1 이라면 결과는 2행x1열입니다. 이때, 2행은 A행렬의 행의 크기이고 1열은 B행렬의 열의 크기이기 때문에 처음 2중 for문 형태에서 위와 같이 표현하게 됩니다.
for i in range(len(A)):
for j in range(len(B[0])):
그 후 특정 행/열안의 요소 갯수는 A행렬의 열 혹은 B행렬의 행이기 때문에
for k in range(len(A[0])):
와 같이 표현하고 연산하면 되는 방식입니다. 차례차례 이해한다면 구현이 어려운 방식은 아니였습니다.
감사합니다.