[문제풀이] 행렬의 곱셈

HKoiKoi·2026년 9월 21일

코딩 테스트

목록 보기
6/16
post-thumbnail

문제

행렬의 곱셈

문제 설명

2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.


제한사항

  • 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
  • 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
  • 곱할 수 있는 배열만 주어집니다.

입출력 예시

arr1arr2return
[[1, 4], [3, 2], [4, 1]][[3, 3], [3, 3]][[15, 15], [15, 15], [15, 15]]
[[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]]

문제 풀이

arr1 (3×23 \times 2)

[143241]\begin{bmatrix} 1 & 4 \\ 3 & 2 \\ 4 & 1 \end{bmatrix}

arr2 (2×22 \times 2)

[3333]\begin{bmatrix} 3 & 3 \\ 3 & 3 \end{bmatrix}

arr3 (3×23 \times 2)

arr2의 열의 크기를 NN이라고 하면 arr3의 각 값은 다음과 같이 표현할 수 있다.

N은 아래에서 arr2의 열의 크기에서 arr1의 열의 크기로 변경하였음.

arr3[i][j]=∑k=0N−1(arr1[i][k]×arr2[k][j])arr3[i][j] = \sum_{k=0}^{N-1} (arr1[i][k] \times arr2[k][j])

arr3[0][0]=∑k=03−1=2(arr1[0][k]×arr2[k][0])arr3[0][0] = \sum_{k=0}^{3-1=2} (arr1[0][k] \times arr2[k][0])
arr3[0][1]=∑k=02(arr1[0][k]×arr2[k][1])arr3[0][1] = \sum_{k=0}^{2} (arr1[0][k] \times arr2[k][1])

def solution(arr1, arr2):
    arr3_row_size = len(arr1)
    arr3_col_size = len(arr2[0])

    answer = [[0] * arr3_col_size for _ in range(arr3_row_size)]

    for i in range(arr3_row_size):
        for j in range(arr3_col_size):
            for k in range(arr3_col_size):
                answer[i][j] += arr1[i][k] * arr2[k][j]
    return answer

실패했다..

찾아보니.. k가 arr3_col_size가 아니었던 것임..

생각해보면 arr3의 사이즈는 arr1의 행 사이즈 ×\times arr2의 열 사이즈가 되는거고
arr1의 열 사이즈와 arr2의 행 사이즈가 같아야 곱하고 더할 수 있는 것이었다.

따라서 NN은 arr1의 열 사이즈임.

최종적으로 arr3[i][j]는 다음과 같이 수식화 할 수 있다.

arr3[i][j]=∑k=0N−1arr1[i][k]×arr2[k][j]arr3[i][j] = \sum_{k=0}^{N-1} arr1[i][k] \times arr2[k][j]

최종 풀이 코드

def solution(arr1, arr2):
    arr3_row_size = len(arr1)
    arr3_col_size = len(arr2[0])
    common_size = len(arr1[0])

    answer = [[0] * arr3_col_size for _ in range(arr3_row_size)]

    for i in range(arr3_row_size):
        for j in range(arr3_col_size):
            for k in range(common_size):
                answer[i][j] += arr1[i][k] * arr2[k][j]
    return answer

느낀점

행렬의 곱셈 구하는 방법

행렬의 곱셈은 앞 행렬의 열 개수와 뒤 행렬의 행 개수가 같아야만 곱할 수 있다.

  • 행렬 AA의 크기가 M×KM \times K이고, 행렬 BB의 크기가 K×NK \times N일 때,
  • 두 행렬을 곱한 결과인 행렬 CC의 크기는 M×NM \times N이 된다.

결과 행렬 CC의 ii행 jj열에 들어갈 값은, 행렬 AA의 ii번째 행과 행렬 BB의 jj번째 열을 순서대로 곱한 뒤 모두 더한 값이다.

예시

행렬 AA (2×32 \times 3)

[123456]\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix}

행렬 BB (3×23 \times 2)

[789101112]\begin{bmatrix} 7 & 8 \\ 9 & 10 \\ 11 & 12 \end{bmatrix}

  • 행렬 CC의 1행 1열 계산
    • 행렬 AA의 11행 [1, 2, 3]과 행렬 BB의 11열 [7, 9, 11]을 순서대로 곱해서 더한다.
      • (1×7)+(2×9)+(3×11)(1 \times 7) + (2 \times 9) + (3 \times 11)
        • =7+18+33= 7 + 18 + 33
        • =58= 58
  • 행렬 CC의 1행 2열 계산
    • 행렬 AA의 11행 [1, 2, 3]과 행렬 BB의 22열 [8, 10, 12]을 순서대로 곱해서 더한다.
      • (1×8)+(2×10)+(3×12)(1 \times 8) + (2 \times 10) + (3 \times 12)
        • =8+20+36= 8 + 20 + 36
        • =64= 64
  • 행렬 CC의 2행 1열 계산
    • 행렬 AA의 22행 [4, 5, 6]과 행렬 BB의 11열 [7, 9, 11]을 순서대로 곱해서 더한다.
      • (4×7)+(5×9)+(6×11)(4 \times 7) + (5 \times 9) + (6 \times 11)
        • =28+45+66= 28 + 45 + 66
        • =139= 139
  • 행렬 CC의 2행 2열 계산
    • 행렬 AA의 22행 [4, 5, 6]과 행렬 BB의 22열 [8, 10, 12]을 순서대로 곱해서 더한다.
      • (4×8)+(5×10)+(6×12)(4 \times 8) + (5 \times 10) + (6 \times 12)
        • =32+50+72= 32 + 50 + 72
        • =154= 154

최종 행렬 CC (2×22 \times 2)

[5864139154]\begin{bmatrix} 58 & 64 \\ 139 & 154 \end{bmatrix}

0개의 댓글