본문 바로가기

공부/알고리즘

[프로그래머스 연습문제]행렬의 곱셈 - Python3

문제

곱셈을 할 수 있는 두 개의 행렬이 주어질 때, 두 행렬의 곱을 출력하라.

https://programmers.co.kr/learn/courses/30/lessons/12949

 

코딩테스트 연습 - 행렬의 곱셈 | 프로그래머스

[[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]]

programmers.co.kr

 

입력

2차원 배열 2개

 

출력

두 행렬의 곱셈의 결과

 

알고리즘

def solution(arr1, arr2):
    # 두 행렬을 파라미터로 받아서, 곱셈을 한 결과값의 형태를 가지고, 모든 값이 0인 행렬을 만든다.
    answer = [len(arr2[0]) * [0] for i in range(len(arr1))]
    
    # 정답 행렬을 2중 for문을 통해 순회하면서, 각 요소의 값을 채운다.
    for i in range(len(answer)):
        for j in range(len(answer[i])):
            
            # 아래에 for문이 가장 핵심이다. 
            for k in range(len(arr1[i])):
                answer[i][j] += arr1[i][k] * arr2[k][j]

    return answer


arr1 = [[1, 4], [3, 2], [4, 1]]
arr2 = [[3, 3], [3, 3]]
print("결과: ", solution(arr1, arr2))

 

설명

1. 2차원 배열 answer의 shape를 정해주고, 모든 값을 0으로 초기화한다.

2. 2중 for문을 통해서 answer의 모든 요소를 순회하면서, 각 요소의 값을 채운다

3. 마지막 for문이 가장 중요하다. 

  • k는 0부터 len(arr1[i]), 즉 첫 번째 행렬의 열의 갯수만큼 반복한다. 
  • 행렬의 곱에서 한 요소의 결과값을 얻으려면, arr1의 한 행과 arr2의 한 열을 차례대로 곱하고, 그 값을 모두 더해야 한다.
  • A가 m * n 행렬이라 하고, B가 a * b 행렬이라 하고, C가 그 결과로 나오는 m * b 행렬이라 하자.
  • C11을 구해보자면, C11 = A11 * B11 + A 12 * B21 + .... + A1n * Ba1 이다.
  • 이 과정을 i, j, k의 인덱스를 사용해서 일반화하고, 그 값을 누적시켜서 더한 것이 3번째 for문의 내용이다.

 

결과

원하는 값을 출력한다.

 

후기

프로그래밍 언어, 알고리즘, 자료구조 등의 학교 수업에서 분명히 배웠던 알고리즘이라 손풀기 정도로 생각하고 도전했는데, 그 내용이 잘 생각나지 않아서 적잖이 당황했다. 이번에 확실하게 정리를 해두고, 반복문의 활용에 대해서도 좀 더 많은 연습이 필요할 것 같다.