안녕하세요.
오늘은 Baekjoon 의 행렬 곱셈 문제를 풀어보는 시간을 가져보도록 하겠습니다.
행렬 정의
문제 및 입출력은 상단의 Image 와 같습니다.
여기서 Keyword 를 얻어가는 것이 중요합니다.
행렬 A = N * M
행렬 B = M * K
이제 이렇게 행렬곱셈을 하기 전의 행렬 값들을 알 수 있습니다.
행렬 곱셈 구하기
이제는 행렬 곱셈 구하는 방법에 대해 생각을 해봐야합니다.
혹시 예전 중학생 때나 고등학생 때 배운거라 기억안나시나요??
이런.. 사실 저도 까먹고 있었답니다.
그러면 한 번 기본적인 개념부터 한 번 다시 배워보는 시간을 가져보겠습니다.
https://mxncalc.com/ko/matrix-multiplication-calculator
행렬 계산을 직접 손으로 작성하는 방법도 있지만, 손글씨보단 계산기 사이트를 공유하여 같이 풀어보는 것이 좋다고 생각이 들었습니다.
행렬 곱셈의 예제입니다.
위 Image 에서 보여준 예제의 식과 풀이과정을 하단에 기술하도록 하겠습니다.
(1 * 3) + (2 * 4) = 3 + 8 = 11
따라서 상단의 Image 에 나온 행렬식의 곱은 11이 나옵니다.
그럼 이제 문제에서 원하는 행렬 값들을 먼저 파악을 하도록 하겠습니다.
문제 풀이
문제 풀이입니다.
입력 값은 초록색 테두리 직사각형을 친 것처럼 구성이 되어 있습니다.
그럼 현재 풀어야 하는 행렬 식을 작성해보겠습니다.
현재 풀어야하는 행렬식입니다.
행렬식과 그 행렬을 곱셈한 값이 같이 나온 값입니다.
풀이 과정은 다음과 같이 나왔습니다.
((1 * -1) + (2 * 0)) <-> ((1 * -2) + (2 * 0)) <-> ((1 * 0) + (2 * 3))
((3 * -1) + (4 * 0)) <-> ((3 * -2) + (4 * 0)) <-> ((3 * 0) + (4 * 3))
((5 * -1) + (6 * 0)) <-> ((5 * -2) + (6 * 0)) <-> ((5 * 0) + (6 * 3))
(-1 -2 6
-3 -6 12
-5 -10 18)
이제 간략한 문제풀이를 끝내보았으니, 한 번 Code 에 옮겨적도록 하겠습니다.
Code 작성
문제 설명하는 단락에서 얻었던 Keyword 를 바탕으로, 문제를 풀어보겠습니다.
N * M 크기의 행렬 A, M * K 크기의 행렬 B 를 정의하도록 합시다.
N 과 M, 그리고 K 를 활용하여 각각 a_list, b_list 의 크기를 정해주고, 값을 넣어주도록 합니다.
이때, 각각의 list 는 모두 2차원 형태로 작성해야 합니다.
이제 행렬 곱셈을 수행하는 함수를 하나 만들어주도록 합시다.
이름은 solution 이라 부르겠습니다.
solution 함수에는 총 4개의 인자가 있습니다.
첫 번째 인자 N 은 N 값을 담은 인자입니다.
두 번째 인자 M 은 M 값을 담은 인자입니다.
세 번째 인자 a_list 는 a_list 를 담은 인자입니다.
네 번째 인자 K 는 K 값을 담은 인자입니다.
다섯 번째 인자 b_list 는 b_list 를 담은 인자입니다.
이제 multi_array 라는 list 를 하나 선언해줍니다.
여기서 만약 K 값이 2일 경우, 빨간 테두리의 직사각형 도형 모양으로 된 부분이 2번씩 반복되어 [0, 0] 이라는 List 를 생성합니다. 그리고 뒤에 N 값이 3일 경우, for _ in range(N) 은 3번 반복하여 [[0, 0], [0, 0], [0, 0]] 이라는 List 를 생성합니다.
이제 이 곳에서 행렬 곱셈을 수행합니다.
행렬 곱셈은 상단에서 설명했던 방법과 같이 수행합니다.
그리고 새롭게 값이 잘 저장된 multi_array 를 return 합니다.
solution 함수를 호출한 후, 문제에서 원하는 방식대로 값을 출력해줍니다.
전체 코드
전체 코드입니다.
약간 Programmers 에서 문제를 푼 느낌이 나는 것처럼 Code 를 구성하였습니다.
하단의 Source 도 함께 첨부하겠습니다.
def solution(N, M, a_list, K, b_list):
multi_array = [[0] * K for _ in range(N)]
for i in range(N):
for j in range(K):
for k in range(M):
multi_array[i][j] += a_list[i][k] * b_list[k][j]
return multi_array
if __name__ == "__main__":
N, M = map(int, input().split())
a_list = []
for i in range(N):
a_list.append(list(map(int, input().split())))
M, K = map(int, input().split())
b_list = []
for i in range(M):
b_list.append(list(map(int, input().split())))
multi_array = solution(N, M, a_list, K, b_list)
for i in multi_array:
for j in i:
print(j, end=' ')
print()
오늘도 감사합니다.