코딩 테스트/Python

88. 행렬의 곱셈

susinlee 2025. 1. 13. 15:44

[문제]

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

[풀이]

1. a x b 행렬과 c x d 행렬을 곱하면 a x d 행렬이 된다. 이때 b = c 이어야 곱셈이 가능하다.

2. arr1의 행의 길이(n)와 arr2의 열의 길이(m)를 구한다.

3. n x m 행렬 answer를 만들어준다.

 

3행 3열인 두 행렬의 곱셈 프로세스를 써보면 다음과 같다.

 

i=0, j=0 → (arr1[0][0] x arr2[0][0]) + 
                  (arr1[0][1] x arr2[1][0]) + 
                  (arr1[0][2] x arr2[2][0])

i=0, j=1 → (arr1[0][0] x arr2[0][1]) + 
                  (arr1[0][1] x arr2[1][1]) + 
                  (arr1[0][2] x arr2[2][1])

i=0, j=2 → (arr1[0][0] x arr2[0][2]) +
                  (arr1[0][1] x arr2[1][2]) +
                  (arr1[0][2] x arr2[2][2])

 

arr1 의 행은 i 에 따라 변화하고, arr2 의 열은 j에 따라 변화한다.

그리고 arr1 의 열과 arr2 의 행은 똑같이 변화하는데 이는 a x b, c x d 에서 b(혹은 c) 크기 만큼 0부터 순회한다.

따라서 arr1 의 열 혹은 arr2 의 행의 길이도 구해준다.

 

이중 for 문을 돌린 뒤 덧셈을 위한 for 문을 한번 더 돌려주면서 answer 의 요소를 채워주자.

def solution(arr1, arr2):
    n = len(arr1)
    m = len(arr2[0])
    l = len(arr1[0])
    answer = [[0]*m for _ in range(n)]

    for i in range(n):
        for j in range(m):
            for k in range(l):
                answer[i][j] += arr1[i][k] * arr2[k][j]

    return answer

 

zip 함수를 통해 arr2 의 열을 가져오고 리스트 컴프리헨션을 활용한다면 더욱 효율적으로 처리가 가능하다.

def solution(arr1, arr2):

    return [[sum(x * y for x, y in zip(row_1, col_2)) for col_2 in zip(*arr2)] for row_1 in arr1]

'코딩 테스트 > Python' 카테고리의 다른 글

87. n^2 배열 자르기  (0) 2025.01.12
86. H-Index  (0) 2025.01.11
85. 연속 부분 수열 합의 개수  (1) 2025.01.08
83. 귤고르기  (0) 2025.01.06
82. 멀리 뛰기  (1) 2025.01.05