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

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

[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의 맨 마지막 위치 & 두번째 원소.

 

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

 

 

 

반응형