[BOJ][๐ก4][๋ฐฑ์ค#17135] ์บ์ฌ ๋ํ์ค
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold IV
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์บ์ฌ ๋ํ์ค๋ ์ฑ์ ํฅํด ๋ชฐ๋ ค์ค๋ ์ ์ ์ก๋ ํด ๋ฐฉ์์ ๊ฒ์์ด๋ค. ๊ฒ์์ด ์งํ๋๋ ๊ณณ์ ํฌ๊ธฐ๊ฐ NรM์ธ ๊ฒฉ์ํ์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ๊ฒฉ์ํ์ 1ร1 ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๊ณ , ๊ฐ ์นธ์ ํฌํจ๋ ์ ์ ์๋ ์ต๋ ํ๋์ด๋ค. ๊ฒฉ์ํ์ N๋ฒํ์ ๋ฐ๋ก ์๋(N+1๋ฒ ํ)์ ๋ชจ๋ ์นธ์๋ ์ฑ์ด ์๋ค. ์ฑ์ ์ ์๊ฒ์ ์งํค๊ธฐ ์ํด ๊ถ์ 3๋ช ์ ๋ฐฐ์นํ๋ ค๊ณ ํ๋ค. ๊ถ์๋ ์ฑ์ด ์๋ย ์นธ์ ๋ฐฐ์นํ ์ ์๊ณ , ํ๋์ ์นธ์๋ ์ต๋ 1๋ช ์ ๊ถ์๋ง ์์ ์ ์๋ค.ย ๊ฐ๊ฐ์ ํด๋ง๋ค ๊ถ์๋ ์ ํ๋๋ฅผ ๊ณต๊ฒฉํ ์ ์๊ณ , ๋ชจ๋ ๊ถ์๋ ๋์์ ๊ณต๊ฒฉํ๋ค. ๊ถ์๊ฐ ๊ณต๊ฒฉํ๋ ์ ์ ๊ฑฐ๋ฆฌ๊ฐ D์ดํ์ธ ์ ์ค์์ ๊ฐ์ฅ ๊ฐ๊น์ด ์ ์ด๊ณ , ๊ทธ๋ฌํ ์ ์ด ์ฌ๋ฟ์ผ ๊ฒฝ์ฐ์๋ ๊ฐ์ฅ ์ผ์ชฝ์ ์๋ ์ ์ ๊ณต๊ฒฉํ๋ค. ๊ฐ์ ์ ์ด ์ฌ๋ฌ ๊ถ์์๊ฒ ๊ณต๊ฒฉ๋นํ ์ ์๋ค. ๊ณต๊ฒฉ๋ฐ์ ์ ์ ๊ฒ์์์ ์ ์ธ๋๋ค. ๊ถ์์ ๊ณต๊ฒฉ์ด ๋๋๋ฉด, ์ ์ด ์ด๋ํ๋ค. ์ ์ ์๋๋ก ํ ์นธ ์ด๋ํ๋ฉฐ, ์ฑ์ด ์๋ ์นธ์ผ๋ก ์ด๋ํ ๊ฒฝ์ฐ์๋ ๊ฒ์์์ ์ ์ธ๋๋ค. ๋ชจ๋ ์ ์ด ๊ฒฉ์ํ์์ ์ ์ธ๋๋ฉด ๊ฒ์์ด ๋๋๋ค.ย ๊ฒ์ ์ค๋ช ์์ ๋ณด๋ค์ํผ ๊ถ์๋ฅผ ๋ฐฐ์นํ ์ดํ์ ๊ฒ์ ์งํ์ ์ ํด์ ธ์๋ค. ๋ฐ๋ผ์, ์ด ๊ฒ์์ ๊ถ์์ ์์น๊ฐ ์ค์ํ๋ค. ๊ฒฉ์ํ์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ๊ถ์์ ๊ณต๊ฒฉ์ผ๋ก ์ ๊ฑฐํ ์ ์๋ ์ ์ ์ต๋ ์๋ฅผ ๊ณ์ฐํด๋ณด์. ๊ฒฉ์ํ์ ๋ ์์น (r1, c1), (r2, c2)์ ๊ฑฐ๋ฆฌ๋ |r1-r2| + |c1-c2|์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฒฉ์ํย ํ์ ์ N, ์ด์ ์ M, ๊ถ์์ ๊ณต๊ฒฉ ๊ฑฐ๋ฆฌ ์ ํ D๊ฐย ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ๊ฒฉ์ํ์ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. 0์ ๋น ์นธ, 1์ ์ ์ด ์๋ ์นธ์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๊ถ์์ ๊ณต๊ฒฉ์ผ๋ก ์ ๊ฑฐํ ์ ์๋ ์ ์ ์ต๋ ์๋ฅผ ์ถ๋ ฅํ๋ค.
์ ํ
3 โค N, M โค 15 1 โค D โค 10
์์
์์ 1
์ ๋ ฅ
5 5 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 1 1 1 1
์ถ๋ ฅ
3
์์ 2
์ ๋ ฅ
5 5 1
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 1 1 1 1
0 0 0 0 0
์ถ๋ ฅ
3
์์ 3
์ ๋ ฅ
5 5 2
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 1 1 1 1
0 0 0 0 0
์ถ๋ ฅ
5
์์ 4
์ ๋ ฅ
5 5 5
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
1 1 1 1 1
์ถ๋ ฅ
15
์์ 5
์ ๋ ฅ
6 5 1
1 0 1 0 1
0 1 0 1 0
1 1 0 0 0
0 0 0 1 1
1 1 0 1 1
0 0 1 0 0
์ถ๋ ฅ
9
์์ 6
์ ๋ ฅ
6 5 2
1 0 1 0 1
0 1 0 1 0
1 1 0 0 0
0 0 0 1 1
1 1 0 1 1
0 0 1 0 0
์ถ๋ ฅ
14
My Sol
def archor(i, s):
global archors, used, W, D, H, Hdec
if i==3: # ๊ถ์ 3์๋ฆฌ ์ ํ ํ๋ฉด
War(archors) # War() ์์
Hdec = H # War ์ดํ Hdec ์ด๊ธฐํ
return
for k in range(s, W):
if not used[k]:
used[k] = 1
archors.append(k)
archor(i+1, k+1)
used[k] = 0
archors.pop()
def War(archors):
global mat, Hdec, matdec, max_kill
# mat์ผ๋ก๋ถํฐ matdec ์์ฑ
matdec = []
for lst in mat:
matdec.append(lst[::])
# ํ wave๋ง๋ค sum_kill ๋์
sum_kill = 0
while Hdec > 0:
setArchors(archors) # matdec์ ๋ฐฐ์น๋๋ก ๊ถ์ ๋ฐฐ์น
sum_kill += attack(archors) # ํ wave ๋ง๋ฌด๋ฆฌํ ๊ณต๊ฒฉ ์์ธ attack() ํจ์ ๋ฐํ๊ฐ์ sum_kill ์ ๋์
matdec.pop() # ๊ถ์ ๋ฐฐ์น ๋นผ๊ณ
matdec.pop() # ์ ๋ค์ ํ ์นธ ๋ด๋ ค์ด
Hdec -= 1 # ์ตํ๋จ ํ ์ธ๋ฑ์ค์ธ Hdec 1 ๊ฐ์
# ํ์ฌ ์ต๊ณ ๊ณต๊ฒฉ์์ ์ด๋ฒ ๋ฐฐ์น์ ๋์ ๊ณต๊ฒฉ์ ๋น๊ตํด ์ต๋๊ฐ์ max_kill์ ์ ์ฅ
max_kill = max(max_kill, sum_kill)
def setArchors(archors):
global W, matdec
# ์ฑ์ 2๋ก ๋๊ณ ๊ถ์์ ์์น๋ 3์ผ๋ก ๋์ด matdec์ ์ถ๊ฐ
lst = [2]*W
for archor in archors:
lst[archor] = 3
matdec.append(lst)
def attack(archors):
global matdec
global D
attack_lst = []
# ๊ถ์๋ณ ์ต์ ์ ์ ์ขํ ๋ฐํ๊ฐ์ attack_lst์ ์ ์ฅ
for archor in archors:
# ์ด๋ฒ ๊ถ์์ ์ต์ ์ ์ ์ขํ ๋ฆฌ์คํธ ๋ฐํ๊ฐ์ attackXY์ ์ ์ฅ
attackXY = selectEnemy(archor, D)
# ์ด๋ฒ ๊ถ์ ๋ฒ์ ๋ด ์ ์์ผ๋ฉด ๋ค์ ๊ถ์ ์กฐํ
if not attackXY:
continue
# attack_lst์ ๊ฐ์ ์ ์ขํ๊ฐ ์์ผ๋ฉด ์ ์ขํ ์ถ๊ฐ
if not attackXY in attack_lst:
attack_lst.append(attackXY)
# ์ ์ขํ ๋ฆฌ์คํธ ๊ฐ๊ฐ ์กฐํํด ์ ์ ๊ฑฐ ํ ์ซ์ ์ธ๊ณ ์ด๋ฅผ ๋ฐํ
attackCnt = 0
for attack in attack_lst:
ai, aj = attack
matdec[ai][aj] = 0
attackCnt += 1
return attackCnt
# ๊ถ์๋ง๋ค ์ต์ ์ ์ ์ ์ ํํ์ฌ ์ขํ๋ฅผ ๋ฐํํ๋ ํจ์
def selectEnemy(archor, D):
global Hdec, W
# x, y ์ขํ์ ๊ถ์๋ก๋ถํฐ์ ๊ฑฐ๋ฆฌ๋ฅผ ๋ด์ Queue ์ด์ฉ
areaQ = [(Hdec, archor, 0)]
start = -1
end = 1
visited = [[0]*W for _ in range(Hdec+1)]
while start < end-1:
start += 1
ni, nj, dis = areaQ[start] # Queue์ ํน์ ์ขํ ์ฌ์ฉ
if dis == D: # ํน์ ์ขํ์ ๊ถ์๊น์ง์ ๊ฑฐ๋ฆฌ๊ฐ D๋ผ๋ฉด ์ด ์ขํ ์ฃผ๋ณ ํ์ ๋ถ๊ฐ
if matdec[ni][nj]==1: # ์ด ์ขํ์ ๊ฐ์ด 1์ด๋ผ๋ฉด ์ด ์ขํ๋ฅผ ๋ฐํํ๋ฉด ๋๋ค. (์ผ์ชฝ๋ถํฐ Queue์ ์ ์ฅ)
return ni, nj
else:
continue
didj = [(0,-1), (-1,0), (0,1)] # ์ข์์ฐ ์์ผ๋ก ์กฐํ
for di, dj in didj:
if 0<=ni+di and 0<=nj+dj<W: # ๋ฒ์๋ฅผ ๋ฒ์ด๋์ง ์๊ณ
if matdec[ni+di][nj+dj]==1: # ์ฃผ๋ณ ํ์๊ฐ์ด 1์ด๋ผ๋ฉด ๋ฐ๋ก ํด๋น ์ขํ ๋ฐํ
return ni+di, nj+dj
if not visited[ni+di][nj+dj]: # ํ์ธํ์ง ์์๋ ๊ณณ์ด๋ผ๋ฉด
visited[ni+di][nj+dj] = 1 # ํด๋น ์ขํ๋ฅผ ํ์ธํ๋ค๊ณ ์ฒดํฌ
areaQ.append((ni+di, nj+dj, dis+1)) # ํ์ฌ ์ขํ๊ฑฐ๋ฆฌ์์ ๊ฑฐ๋ฆฌ๋ฅผ 1 ์ถ๊ฐํ๊ณ ์ขํ์ ํจ๊ป areaQ์ ์ฝ์
end += 1
H, W, D = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(H)]
Hdec = H
matdec = []
archors = []
used = [0]*W
enemies = []
max_kill = 0
archor(0, 0)
print(max_kill)
๊ณต๊ฒฉํ ๋์์ ์ ํํ๋ ๊ฒ๋, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ถ์๊ฐ ํ ๋ฒ์ ๊ณต๊ฒฉ์ ํด์ผํ๋ ๊ฒ๋, ์ ์ด ๋ด๋ ค์ค๊ธฐ ๋๋ฌธ์ mat ์์ฒด๋ฅผ ๋ฐ๊ฟ์ค์ผํ๋ ๊ฒ๋ ๊ฝค๋ ๊น๋ค๋ก์ด ๋ฌธ์ ์๋ค. ํจ์๋ฅผ ๋๋์ด ๋ชจ๋ํํ์๊ณ , ์ฝ๋๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ ์์ํ ์ค์๋ ์ฃผ์ํด์ผ ํ๋ค.
3๋ช ์ ๊ถ์๋ฅผ ์ ํํ์ฌ ๋ฐฐ์นํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ฐ์ง๋ฏ๋ก ์์ ํ์๊ณผ ๋ฐฑํธ๋ํน์ ์ฌ์ฉํ๊ณ , ์ด ๊ถ์๋ฅผ ์ ํํ ๋์๋ DFS์ ์กฐํฉ, ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ๋ค. ๊ถ์๋ง๋ค ์ต์ ์ ์ ์ขํ๋ฅผ ๊ณ์ฐํ๋ selectEnemy() ํจ์์์๋ BFS๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฑฐ๋ฆฌ์ด๋ฉด์ ์ผ์ชฝ์ ์๋ ์ ์ ์ขํ๋ฅผ ๋ฐํํ๋ค.
๊ฐ ์ฝ๋๋ณ ์ค๋ช ์ ํ์์ ํ๊ธฐ์๋ ์ฝ๋๊ฐ ๋๋ฌด ๊ธธ์ด์ ์์ฑํ ์ฝ๋๋ง๋ค ์ฃผ์์ผ๋ก ์ค๋ช ์ ๋ฌ๊ฒ ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ