문제
행렬의 곱셈
문제 설명
2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.
제한사항
- 행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.
- 행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.
- 곱할 수 있는 배열만 주어집니다.
입출력 예시
| arr1 | arr2 | return |
|---|
| [[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×2)
⎣⎢⎡134421⎦⎥⎤
arr2 (2×2)
[3333]
arr3 (3×2)
arr2의 열의 크기를 N이라고 하면 arr3의 각 값은 다음과 같이 표현할 수 있다.
N은 아래에서 arr2의 열의 크기에서 arr1의 열의 크기로 변경하였음.
arr3[i][j]=∑k=0N−1(arr1[i][k]×arr2[k][j])
arr3[0][0]=∑k=03−1=2(arr1[0][k]×arr2[k][0])
arr3[0][1]=∑k=02(arr1[0][k]×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의 행 사이즈 × arr2의 열 사이즈가 되는거고
arr1의 열 사이즈와 arr2의 행 사이즈가 같아야 곱하고 더할 수 있는 것이었다.
따라서 N은 arr1의 열 사이즈임.
최종적으로 arr3[i][j]는 다음과 같이 수식화 할 수 있다.
arr3[i][j]=∑k=0N−1arr1[i][k]×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
느낀점
행렬의 곱셈 구하는 방법
행렬의 곱셈은 앞 행렬의 열 개수와 뒤 행렬의 행 개수가 같아야만 곱할 수 있다.
- 행렬 A의 크기가 M×K이고, 행렬 B의 크기가 K×N일 때,
- 두 행렬을 곱한 결과인 행렬 C의 크기는 M×N이 된다.
결과 행렬 C의 i행 j열에 들어갈 값은, 행렬 A의 i번째 행과 행렬 B의 j번째 열을 순서대로 곱한 뒤 모두 더한 값이다.
예시
행렬 A (2×3)
[142536]
행렬 B (3×2)
⎣⎢⎡791181012⎦⎥⎤
- 행렬 C의 1행 1열 계산
- 행렬 A의 1행
[1, 2, 3]과 행렬 B의 1열 [7, 9, 11]을 순서대로 곱해서 더한다.
- (1×7)+(2×9)+(3×11)
- =7+18+33
- =58
- 행렬 C의 1행 2열 계산
- 행렬 A의 1행
[1, 2, 3]과 행렬 B의 2열 [8, 10, 12]을 순서대로 곱해서 더한다.
- (1×8)+(2×10)+(3×12)
- =8+20+36
- =64
- 행렬 C의 2행 1열 계산
- 행렬 A의 2행
[4, 5, 6]과 행렬 B의 1열 [7, 9, 11]을 순서대로 곱해서 더한다.
- (4×7)+(5×9)+(6×11)
- =28+45+66
- =139
- 행렬 C의 2행 2열 계산
- 행렬 A의 2행
[4, 5, 6]과 행렬 B의 2열 [8, 10, 12]을 순서대로 곱해서 더한다.
- (4×8)+(5×10)+(6×12)
- =32+50+72
- =154
최종 행렬 C (2×2)
[5813964154]