문제

[프로그래머스] 행렬의 곱셈 (LV. 2)

요약

  • 두 행렬이 주어지면 행렬을 곱을 반환하자
  • 곱셈이 불가능한 경우는 주어지지 않는다.


분류

  • 배열

풀이

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