문제. 행렬의 곱셈
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]] |
나의 풀이
def solution(arr1, arr2):
answer = []
cn1 = len(arr1[0]) #arr1의 열의 개수 = arr2의 행의 개수
cn2 = len(arr2[0]) #arr2의 열의 개수
for i in range(len(arr1)):
r = []
for j in range(cn2):
v = 0
for k in range(cn1):
v += arr1[i][k] * arr2[k][j]
r.append(v)
answer.append(r)
return answer
행렬의 곱셈이 성립하기 위해서는 첫번째 행렬의 열과 두번째 행렬의 행의 개수가 같아야 하므로, 3가지의 for문을 이용하면 쉽게 풀 수 있을 것이라고 생각했습니다.
다른 사람의 풀이
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에 대해서 어느 정도 공부한 바 있어 코드를 이해하는데는 문제가 없었습니다. 다만, zip(*B) 이 부분이 무슨 의미인지 정확히 모르겠어서 print를 이용하여 실험해보았습니다.
arr2 = [[5, 4, 3], [2, 4, 1], [3, 1, 1]]
print(list(zip(*arr2)))
#[(5, 2, 3), (4, 4, 1), (3, 1, 1)]
print(list(zip(arr2)))
#[([5, 4, 3],), ([2, 4, 1],), ([3, 1, 1],)]
*를 추가해줌으로써 arr2 내의 동일한 개수를 가진 리스트끼리 묶어준 것을 알 수 있습니다. zip의 경우, 다방면으로 활용할 수 있기에 좀 더 공부해볼 필요성이 있는 것 같습니다.
반응형
'Tests > 프로그래머스' 카테고리의 다른 글
[Programmers] 다음 큰 숫자 (0) | 2020.07.23 |
---|---|
[Programmers] 큰 수 만들기 (0) | 2020.07.23 |
[Programmers] 피보나치 수 (0) | 2020.07.21 |
[Programmers] 숫자의 표현 (0) | 2020.07.20 |
[Programmers] 최솟값 만들기 (0) | 2020.07.20 |
댓글