본문 바로가기

개발/Algorithm

[프로그래머스] 행렬의 곱셈(python)

프로그래머스, 행렬의 곱셈

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