프로그래머스, 행렬의 곱셈
TL;DR
- 리스트(list)
문제 분석
1. 입력받은 2차원 행렬 arr1, arr2을 곱한 결과를 반환하는 함수를 완성하라.
- 행렬의 곱셈을 구현하는 함수를 작성하는 것이 해결해야 하는 문제이다.
입출력 형태
- 행렬의 곱셈은 arr1의 행과 arr2의 열을 각각 곱하여 더하는 방식이다.
- 예시 1의 결과의 첫 번째 줄만 살펴보면 행렬의 곱셈에 따라 (1 * 3) + (4 * 3) = 15가 되어 [15, 15]의 결과를 얻을 수 있다.
풀이
def solution(arr1, arr2):
answer = [[] for _ in range(len(arr1))]
for i in range(len(arr1)): # arr1의 행
tmp = [0] * len(arr2[0])
for j in range(len(arr1[0])): # arr1의 열, arr2의 행
for k in range(len(arr2[0])): # arr2의 열
tmp[k] += arr1[i][j] * arr2[j][k]
answer[i] = tmp
return answer
- 문제의 제약 조건에서 행렬의 길이가 2이상 100이하라고 하였으므로 브루트 포스를 사용하여 문제를 해결해도 시간 초과 등의 문제가 발생하지 않는다.
- 행렬의 곱셈에서 결과 행렬의 크기는 arr1의 행 크기와 arr2의 열 크기가 된다는 점을 이용하여 코드를 작성하였다.
- 예시 1에서 arr1의 크기는 3 * 2이고, arr2의 크기는 2 * 2이다 따라서 행렬의 곱셈의 결과의 크기는 3 * 2가 된다.
다른 풀이
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` 함수를 사용한 한 줄로 작성된 코드가 인상깊어서 참고용으로 가져와보았다. 리스트 컴프리헨션을 여러 번 사용하여 짐짓 복잡해보이지만 하나씩 해석해보면 동일한 동작을 하는 것을 확인할 수 있다.
- `sum(a * b for a, b in zip(A_row, B_col))` : 이 코드가 의미하는 것은 A의 행과 B의 열에 있는 원소를 각각 곱하는 것을 의미한다.
- `for B_col in zip(*B)` : 이 코드에 의해 B_col은 B의 각 열을 순회하며 조회한다.
- `for A_row in A` : 이 코드에 의해 A_row는 A의 각 행을 순회하며 조회한다.
'개발 > Algorithm' 카테고리의 다른 글
[백준] 고무오리 디버깅(python) (0) | 2021.07.23 |
---|---|
[백준] 수들의 합2(python) (0) | 2021.07.22 |
[리트코드] Subsets(python) (0) | 2021.07.20 |
[리트코드] Combination Sum(python) (0) | 2021.07.20 |
[백준] DFS와 BFS(python) (0) | 2021.07.19 |