Skip to content

Commit 98e218b

Browse files
committed
[Gold IV] Title: 뮤탈리스크, Time: 12 ms, Memory: 80308 KB -BaekjoonHub
1 parent ed2632f commit 98e218b

2 files changed

Lines changed: 94 additions & 0 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# [Gold IV] 뮤탈리스크 - 12869
2+
3+
[문제 링크](https://www.acmicpc.net/problem/12869)
4+
5+
### 성능 요약
6+
7+
메모리: 80308 KB, 시간: 12 ms
8+
9+
### 분류
10+
11+
다이나믹 프로그래밍, 그래프 이론, 그래프 탐색, 너비 우선 탐색
12+
13+
### 제출 일자
14+
15+
2025년 10월 6일 11:12:27
16+
17+
### 문제 설명
18+
19+
<p>수빈이는 강호와 함께 스타크래프트 게임을 하고 있다. 수빈이는 뮤탈리스크 1개가 남아있고, 강호는 SCV N개가 남아있다.</p>
20+
21+
<p>각각의 SCV는 남아있는 체력이 주어져있으며, 뮤탈리스크를 공격할 수는 없다. 즉, 이 게임은 수빈이가 이겼다는 것이다.</p>
22+
23+
<p>뮤탈리스크가 공격을 할 때, 한 번에 세 개의 SCV를 공격할 수 있다.</p>
24+
25+
<ol>
26+
<li>첫 번째로 공격받는 SCV는 체력 9를 잃는다.</li>
27+
<li>두 번째로 공격받는 SCV는 체력 3을 잃는다.</li>
28+
<li>세 번째로 공격받는 SCV는 체력 1을 잃는다.</li>
29+
</ol>
30+
31+
<p>SCV의 체력이 0 또는 그 이하가 되어버리면, SCV는 그 즉시 파괴된다. 한 번의 공격에서 같은 SCV를 여러 번 공격할 수는 없다.</p>
32+
33+
<p>남아있는 SCV의 체력이 주어졌을 때, 모든 SCV를 파괴하기 위해 공격해야 하는 횟수의 최솟값을 구하는 프로그램을 작성하시오.</p>
34+
35+
### 입력
36+
37+
<p>첫째 줄에 SCV의 수 N (1 ≤ N ≤ 3)이 주어진다. 둘째 줄에는 SCV N개의 체력이 주어진다. 체력은 60보다 작거나 같은 자연수이다.</p>
38+
39+
### 출력
40+
41+
<p>첫째 줄에 모든 SCV를 파괴하기 위한 공격 횟수의 최솟값을 출력한다.</p>
42+
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import Foundation
2+
3+
let n = Int(readLine()!)
4+
var hp = readLine()!.split { $0 == " " }.map { Int(String($0))! }
5+
while hp.count < 3 {
6+
hp.append(0)
7+
}
8+
hp.sort(by: >)
9+
10+
let (A, B, C) = (hp[0], hp[1], hp[2])
11+
12+
var dp = Array(
13+
repeating: Array(
14+
repeating: Array(repeating: -1, count: 61),
15+
count: 61
16+
),
17+
count: 61
18+
)
19+
20+
let attacks = [
21+
[9, 3, 1], [9, 1, 3],
22+
[3, 9, 1], [3, 1, 9],
23+
[1, 9, 3], [1, 3, 9],
24+
]
25+
26+
// DFS로 SCV의 깍인 체력 패턴별로 dp를 구한다음
27+
// 상위(체력이 얼마 안깍인 상태에서 하위 상태 트리로 내려가려고 하는 트리의 위치)일 때 연산을 생략
28+
29+
func dfs(_ a: Int, _ b: Int, _ c: Int) -> Int {
30+
let aa = max(0, a)
31+
let bb = max(0, b)
32+
let cc = max(0, c)
33+
34+
if aa == 0 && bb == 0 && cc == 0 { return 0 }
35+
36+
if dp[aa][bb][cc] != -1 { return dp[aa][bb][cc] }
37+
38+
var result = Int.max
39+
40+
for atk in attacks {
41+
let na = max(0, aa - atk[0])
42+
let nb = max(0, bb - atk[1])
43+
let nc = max(0, cc - atk[2])
44+
let value = 1 + dfs(na, nb, nc)
45+
if value < result { result = value }
46+
}
47+
48+
dp[aa][bb][cc] = result
49+
return result
50+
}
51+
52+
print(dfs(A, B, C))

0 commit comments

Comments
 (0)