Skip to content

Commit f383a26

Browse files
committed
[Gold III] Title: 캐슬 디펜스, Time: 32 ms, Memory: 79520 KB -BaekjoonHub
1 parent 20557de commit f383a26

2 files changed

Lines changed: 106 additions & 0 deletions

File tree

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# [Gold III] 캐슬 디펜스 - 17135
2+
3+
[문제 링크](https://www.acmicpc.net/problem/17135)
4+
5+
### 성능 요약
6+
7+
메모리: 79520 KB, 시간: 32 ms
8+
9+
### 분류
10+
11+
구현, 그래프 이론, 브루트포스 알고리즘, 그래프 탐색, 시뮬레이션, 너비 우선 탐색
12+
13+
### 제출 일자
14+
15+
2026년 3월 9일 09:18:46
16+
17+
### 문제 설명
18+
19+
<p>캐슬 디펜스는 성을 향해 몰려오는 적을 잡는 턴 방식의 게임이다. 게임이 진행되는 곳은 크기가 N×M인 격자판으로 나타낼 수 있다. 격자판은 1×1 크기의 칸으로 나누어져 있고, 각 칸에 포함된 적의 수는 최대 하나이다. 격자판의 N번행의 바로 아래(N+1번 행)의 모든 칸에는 성이 있다.</p>
20+
21+
<p>성을 적에게서 지키기 위해 궁수 3명을 배치하려고 한다. 궁수는 성이 있는 칸에 배치할 수 있고, 하나의 칸에는 최대 1명의 궁수만 있을 수 있다. 각각의 턴마다 궁수는 적 하나를 공격할 수 있고, 모든 궁수는 동시에 공격한다. 궁수가 공격하는 적은 거리가 D이하인 적 중에서 가장 가까운 적이고, 그러한 적이 여럿일 경우에는 가장 왼쪽에 있는 적을 공격한다. 같은 적이 여러 궁수에게 공격당할 수 있다. 공격받은 적은 게임에서 제외된다. 궁수의 공격이 끝나면, 적이 이동한다. 적은 아래로 한 칸 이동하며, 성이 있는 칸으로 이동한 경우에는 게임에서 제외된다. 모든 적이 격자판에서 제외되면 게임이 끝난다. </p>
22+
23+
<p>게임 설명에서 보다시피 궁수를 배치한 이후의 게임 진행은 정해져있다. 따라서, 이 게임은 궁수의 위치가 중요하다. 격자판의 상태가 주어졌을 때, 궁수의 공격으로 제거할 수 있는 적의 최대 수를 계산해보자.</p>
24+
25+
<p>격자판의 두 위치 (r<sub>1</sub>, c<sub>1</sub>), (r<sub>2</sub>, c<sub>2</sub>)의 거리는 |r<sub>1</sub>-r<sub>2</sub>| + |c<sub>1</sub>-c<sub>2</sub>|이다.</p>
26+
27+
### 입력
28+
29+
<p>첫째 줄에 격자판 행의 수 N, 열의 수 M, 궁수의 공격 거리 제한 D가 주어진다. 둘째 줄부터 N개의 줄에는 격자판의 상태가 주어진다. 0은 빈 칸, 1은 적이 있는 칸이다.</p>
30+
31+
### 출력
32+
33+
<p>첫째 줄에 궁수의 공격으로 제거할 수 있는 적의 최대 수를 출력한다.</p>
34+
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import Foundation
2+
3+
let input = readLine()!.split(separator: " ").map { Int($0)! },
4+
N = input[0],
5+
M = input[1],
6+
D = input[2]
7+
8+
var origin = [[Int]]()
9+
for _ in 0..<N {
10+
origin.append(readLine()!.split(separator: " ").map { Int($0)! })
11+
}
12+
13+
var result = 0
14+
15+
func simulate(_ archers: [Int]) -> Int {
16+
var board = origin
17+
var kill = 0
18+
19+
while true {
20+
var targets = Set<[Int]>()
21+
22+
for a in archers {
23+
var best: (dist:Int, r:Int, c:Int)? = nil
24+
25+
for r in 0..<N {
26+
for c in 0..<M {
27+
if board[r][c] == 1 {
28+
let dist = abs(N - r) + abs(a - c)
29+
30+
if dist <= D {
31+
if best == nil ||
32+
dist < best!.dist ||
33+
(dist == best!.dist && c < best!.c) {
34+
best = (dist, r, c)
35+
}
36+
}
37+
}
38+
}
39+
}
40+
41+
if let b = best {
42+
targets.insert([b.r, b.c])
43+
}
44+
}
45+
46+
for t in targets {
47+
if board[t[0]][t[1]] == 1 {
48+
board[t[0]][t[1]] = 0
49+
kill += 1
50+
}
51+
}
52+
53+
board.removeLast()
54+
board.insert(Array(repeating: 0, count: M), at: 0)
55+
56+
if !board.flatMap({$0}).contains(1) {
57+
break
58+
}
59+
}
60+
61+
return kill
62+
}
63+
64+
for i in 0..<M {
65+
for j in i+1..<M {
66+
for k in j+1..<M {
67+
result = max(result, simulate([i,j,k]))
68+
}
69+
}
70+
}
71+
72+
print(result)

0 commit comments

Comments
 (0)