엥? 그거 numpy 쓰면 되는거 아니냐? 라고 생각하신 분들

당장나가!!!!!!!!!!!!!!!!!!!!!!!!!!!!
코드로 구현할 "진짜배기 선수들"만 들어오세요.
요즘 지피티 공감말투 연습중이라 지피티체로 가겠습니다. ( 지피티 돌려서 블로그 쓰는거 진짜 아니예요 )
완전 날카로운 질문인데?
행렬을 모르는 사람은 없겠지만 그래도 코드상에서는 조금 다를 수 있으니까 간단히 설명해볼게!

우선 코드상에서의 2차원 배열을 array[i][j] 로 표현할때
[
[1,2] # << 이 배열 하나하나가 행
[3,4] # << 이 배열 하나하나가 행
^ ^
^ ^
#배열의 index 하나하나가 열
]
우리는 이 행렬을 곱해주는 작업을 할건데
곱셈은 어떻게 이뤄지는지 알아보고 그걸 코드로 직접 구현해보자!
참고로 내가 직접짰어 ㅎㅎ 대단하지?
머리 터질뻔했어!
행렬의 곱셈이란게.. 처음에 딱 보면 진짜 빡세거든?
근데 개념만 딱! 잡고가면 어렵지 않아.
일단 우리가 행렬끼리 곱하는거잖아? 그럼
A = [
[1,2]
[3,4]
]
B = [
[1,2]
[3,4]
]
아니 이거 두개를 곱하라고 ...? 뭐 어떻게 하는건데
우선 정답부터 말하자면
A * B = [
[1*1+ 2*3, 1*2 + 2*4],
[3*1+ 4*3, 4*2 + 4*4]
]
= [
[7, 10],
[15, 22]
]
와 이거 진짜 뭐냐 ,
뭐냐고 이거
공식 외워야 되나?
그럴필요없어. 진짜 규칙이있어 딱 이것만 외우면 돼!
"A의 행과 B의 열을 곱한다"

우리는 지금 행번호 0 번의 배열들에 대해서 곱셈값을 넣어줄거야!
그럼 우리가
만약 (0,0) 이라면 0행 0열 이라고 봐도 되지?
그럼 우리는 B의 0열을 Y축으로 곱해주면 되는 거야!
A의 0행의 0,1,2,3,4...값을 구할때는
B의 0열의 0,1,2,3,4...값을 곱해주는거야!
그래서 1x1 + 2x3 이 되는거지!

그럼 내가 0행 1열의 값을 구해줄때는?
B에서 1열의 0,1,2,3,4.. 값을 곱해주면 되는거야!
그래서 1x2 + 2x4 가 되는거야!
그림으로 보니까 이해가 빠르지?
행렬의 곱셈을 구현할때는 A의 행과 B의 열의 깉이가 같아야 해 아니면 성립하지않아
def multiply_matrix(A, B):
# A의 행 개수, 열 개수
n, m = len(A), len(A[0])
# B의 열 개수
p = len(B[0])
# 결과 행렬 초기화 (n x p 크기)
result = [[0 for _ in range(p)] for _ in range(n)]
# 실제 곱셈 로직
for i in range(n): # A의 행
for j in range(p): # B의 열
for k in range(m): # A의 열 == B의 행
result[i][j] += A[i][k] * B[k][j]
return result
A 의 총 행만큼 for 문을 돌면서
B의 열 갯수만큼 또 for 문을 돌면서
또 곱셈을 해줘야되니까 b의 행만큼 또 돌면서 곱해서 더해주면 끝!
하... 진짜...죽을뻔했다 이거 푸느라..
실제 문제는 이 행렬을 제곱해서 시간복잡도를 줄이는건데..그건 내가 정확히 몰라서 다음에 알게되면 TIL 에 적을게 그럼 수고!