공부하고 기록하는, 경제학과 출신 개발자의 노트

프로그래밍/코딩테스트 문제풀이

[Python] 프로그래머스. 최적의 행렬 곱셈 (Level 4)

inspirit941 2020. 9. 3. 18:10
반응형

programmers.co.kr/learn/courses/30/lessons/12942

 

코딩테스트 연습 - 최적의 행렬 곱셈

크기가 a by b인 행렬과 크기가 b by c 인 행렬이 있을 때, 두 행렬을 곱하기 위해서는 총 a x b x c 번 곱셈해야합니다. 예를 들어서 크기가 5 by 3인 행렬과 크기가 3 by 2인 행렬을 곱할때는 총 5 x 3 x 2 =

programmers.co.kr

DP문제. 이전에 풀었던 백준 파일합치기 문제와 로직은 동일하다.

 

[Python] 백준 11066. 파일 합치기

https://www.acmicpc.net/problem/11066 11066번: 파일 합치기 문제 소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각.

inspirit941.tistory.com

matrix를 문제 예시대로 [[5,3],[3,10],[10,6]] 으로 정의하고,

table[start][end] = matrix의 start index부터 end index까지 행렬곱셈 연산의 최솟값이라고 정의하자.

start == end인 경우, 행렬연산이 불가능하므로 table값을 0으로 설정한다.

 

예컨대 table[0][2]를 구한다면,

table[0][2] = min(
	table[0][분할기준점 0] + table[분할기준점 0 + 1 = 1][2] + (matrix[0][0] * matrix[분할기준점][1] * matrix[2][1]),
    table[0][분할기준점 1] + table[분할기준점 1+1 = 2][2] + (matrix[0][0] * matrix[분할기준점][1] * matrix[2][1])
)

형태가 된다. 

 

연산처리를 하기 위한 분할 기준점 index를 0으로 둘 경우, [3,10][10,6]은 이미 연산이 끝났고, 연산 결과 행렬은 [3,6] 이 된다.

분할 기준점까지의 행렬은 [5,3] 이므로, [5,3]과 [3,6]을 연산해야 한다.

따라서 필요한 값은 5, 3, 6이다.

matrix에서 5, 3, 6이 어느 위치에 있는 값인지 확인해보면,

 

5는 연산하려는 matrix의 맨 첫번째 위치 & 첫번째 원소

3은 연산하려는 matrix의 분할기준점 & 두번째 원소. (논리적으로는 분할기준점 바로 다음 행렬의 첫번째 원소이지만, 분할기준점의 두번째 원소와 값이 같다.)

6은 연산하려는 matrix의 맨 마지막 위치 & 두번째 원소.

 

따라서 이 위치값을 토대로 점화식을 구하면 된다.

 

 

 

import math
def solution(matrix_sizes):
# table[start][end] = 인덱스 start ~ end 까지의 연산 최솟값.
table = [[math.inf for _ in range(len(matrix_sizes))] for _ in range(len(matrix_sizes))]
# start와 end가 동일한 경우는 연산하지 않으므로 0으로 설정.
for idx in range(len(matrix_sizes)):
table[idx][idx] = 0
for gap in range(1, len(matrix_sizes)):
for start in range(len(matrix_sizes)):
end = start + gap
if end >= len(matrix_sizes):
break
for sep in range(start, end):
table[start][end] = min(
table[start][end],
table[start][sep] + table[sep+1][end] + (matrix_sizes[start][0] * matrix_sizes[sep][1] * matrix_sizes[end][1])
)
return table[0][-1]

반응형