문제
요약
- 두 행렬이 주어지면 행렬을 곱을 반환하자
- 곱셈이 불가능한 경우는 주어지지 않는다.
분류
- 배열
풀이
1. 내 풀이
-
<1차 풀이>
-
작은 부분에서 실수를 했다.
```python def solution(arr1, arr2): c1 = len(arr1); r1 = len(arr1[0]) c2 = len(arr2); r2 = len(arr2[0]) arr = [[0] * r2] * c1 for col in range(c1): for row in range(r2): for cur in range(r1): arr[col][row] += arr1[col][cur] * arr2[cur][row] return arr ``` => 이 코드에서 print(temp)와 print(arr) 을 넣어 진행 상황을 보면 다음과 같이 나온다. ``` 22 [[22, 0, 0], [22, 0, 0], [22, 0, 0]] 22 [[22, 22, 0], [22, 22, 0], [22, 22, 0]] 11 [[22, 22, 11], [22, 22, 11], [22, 22, 11]] 36 [[36, 22, 11], [36, 22, 11], [36, 22, 11]] 28 [[36, 28, 11], [36, 28, 11], [36, 28, 11]] 18 [[36, 28, 18], [36, 28, 18], [36, 28, 18]] 29 [[29, 28, 18], [29, 28, 18], [29, 28, 18]] 20 [[29, 20, 18], [29, 20, 18], [29, 20, 18]] 14 [[29, 20, 14], [29, 20, 14], [29, 20, 14]] ``` 문제가 된 부분은 ```python arr = [[0] * r2] * c1 ``` 이 부분이다. 다음과 같이 진행된다. c1 곱연산이 진행되며 주소값이 같은 리스트가 복사가 된다. 따라서 [0, 0, 0] 의 각 요소는 같은 주솟값을 갖는다. row 인덱스가 0인 값을 하나 바꾸면 모든 column 의 row 가 0인 값이 바뀌는 것이다. ```python # r2 = 3, c1 = 3 이라 할 때, arr = [[0] * r2] * c1 arr = [0, 0, 0] * c1 arr = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] ```
-
-
최종 풀이
def solution(arr1, arr2): c1 = len(arr1); r1 = len(arr1[0]) c2 = len(arr2); r2 = len(arr2[0]) arr = [[0] * r2 for _ in range(c1)] for col in range(c1): for row in range(r2): for cur in range(r1): arr[col][row] += arr1[col][cur] * arr2[cur][row] return arr