Skip to content

Commit cc3d8a3

Browse files
committed
[Gold III] Title: 행렬 곱셈 순서, Time: 100 ms, Memory: 71088 KB -BaekjoonHub
1 parent 31c092b commit cc3d8a3

2 files changed

Lines changed: 71 additions & 0 deletions

File tree

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# [Gold III] 행렬 곱셈 순서 - 11049
2+
3+
[문제 링크](https://www.acmicpc.net/problem/11049)
4+
5+
### 성능 요약
6+
7+
메모리: 71088 KB, 시간: 100 ms
8+
9+
### 분류
10+
11+
다이나믹 프로그래밍
12+
13+
### 제출 일자
14+
15+
2025년 1월 23일 23:08:49
16+
17+
### 문제 설명
18+
19+
<p>크기가 N×M인 행렬 A와 M×K인 B를 곱할 때 필요한 곱셈 연산의 수는 총 N×M×K번이다. 행렬 N개를 곱하는데 필요한 곱셈 연산의 수는 행렬을 곱하는 순서에 따라 달라지게 된다.</p>
20+
21+
<p>예를 들어, A의 크기가 5×3이고, B의 크기가 3×2, C의 크기가 2×6인 경우에 행렬의 곱 ABC를 구하는 경우를 생각해보자.</p>
22+
23+
<ul>
24+
<li>AB를 먼저 곱하고 C를 곱하는 경우 (AB)C에 필요한 곱셈 연산의 수는 5×3×2 + 5×2×6 = 30 + 60 = 90번이다.</li>
25+
<li>BC를 먼저 곱하고 A를 곱하는 경우 A(BC)에 필요한 곱셈 연산의 수는 3×2×6 + 5×3×6 = 36 + 90 = 126번이다.</li>
26+
</ul>
27+
28+
<p>같은 곱셈이지만, 곱셈을 하는 순서에 따라서 곱셈 연산의 수가 달라진다.</p>
29+
30+
<p>행렬 N개의 크기가 주어졌을 때, 모든 행렬을 곱하는데 필요한 곱셈 연산 횟수의 최솟값을 구하는 프로그램을 작성하시오. 입력으로 주어진 행렬의 순서를 바꾸면 안 된다.</p>
31+
32+
### 입력
33+
34+
<p>첫째 줄에 행렬의 개수 N(1 ≤ N ≤ 500)이 주어진다.</p>
35+
36+
<p>둘째 줄부터 N개 줄에는 행렬의 크기 r과 c가 주어진다. (1 ≤ r, c ≤ 500)</p>
37+
38+
<p>항상 순서대로 곱셈을 할 수 있는 크기만 입력으로 주어진다.</p>
39+
40+
### 출력
41+
42+
<p>첫째 줄에 입력으로 주어진 행렬을 곱하는데 필요한 곱셈 연산의 최솟값을 출력한다. 정답은 2<sup>31</sup>-1 보다 작거나 같은 자연수이다. 또한, 최악의 순서로 연산해도 연산 횟수가 2<sup>31</sup>-1보다 작거나 같다.</p>
43+
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
typealias Metrix = (n: Int, m: Int)
2+
3+
func multiple(_ a: Metrix, _ b: Metrix) -> (Int, Metrix) {
4+
guard a.m == b.n else { fatalError("Invalid Metrix, \(a), \(b)") }
5+
return (a.n * a.m * b.m, Metrix(a.n, b.m))
6+
}
7+
8+
let N = Int(readLine()!)!
9+
var metrices = [Metrix]()
10+
var dp = [[Int]](repeating: [Int](repeating: 0, count: N), count: N)
11+
12+
for _ in 0..<N {
13+
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
14+
metrices.append((input[0], input[1]))
15+
}
16+
17+
for d in 1..<N {
18+
for start in 0..<N-d {
19+
let end = start + d
20+
var result = Int.max
21+
for mid in start..<end {
22+
result = min(result, dp[start][mid] + dp[mid+1][end] + metrices[start].n * metrices[mid].m * metrices[end].m)
23+
}
24+
dp[start][end] = result
25+
}
26+
}
27+
28+
print(dp[0][N-1])

0 commit comments

Comments
 (0)