[BOJ][๐ก5][๋ฐฑ์ค#14502] ์ฐ๊ตฌ์
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์ธ์ฒด์ ์น๋ช ์ ์ธ ๋ฐ์ด๋ฌ์ค๋ฅผ ์ฐ๊ตฌํ๋ ์ฐ๊ตฌ์์์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ์ถ๋์๋ค. ๋คํํ ๋ฐ์ด๋ฌ์ค๋ ์์ง ํผ์ง์ง ์์๊ณ , ๋ฐ์ด๋ฌ์ค์ ํ์ฐ์ ๋ง๊ธฐ ์ํด์ ์ฐ๊ตฌ์์ ๋ฒฝ์ ์ธ์ฐ๋ ค๊ณ ํ๋ค. ์ฐ๊ตฌ์๋ ํฌ๊ธฐ๊ฐ NรM์ธ ์ง์ฌ๊ฐํ์ผ๋ก ๋ํ๋ผ ์ ์์ผ๋ฉฐ, ์ง์ฌ๊ฐํ์ 1ร1 ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ์ฐ๊ตฌ์๋ ๋น ์นธ, ๋ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ, ๋ฒฝ์ ์นธ ํ๋๋ฅผ ๊ฐ๋ ์ฐจ์งํ๋ค.ย ์ผ๋ถ ์นธ์ ๋ฐ์ด๋ฌ์ค๊ฐ ์กด์ฌํ๋ฉฐ, ์ด ๋ฐ์ด๋ฌ์ค๋ ์ํ์ข์ฐ๋ก ์ธ์ ํ ๋น ์นธ์ผ๋ก ๋ชจ๋ ํผ์ ธ๋๊ฐ ์ ์๋ค. ์๋ก ์ธ์ธ ์ ์๋ ๋ฒฝ์ ๊ฐ์๋ 3๊ฐ์ด๋ฉฐ, ๊ผญ 3๊ฐ๋ฅผ ์ธ์์ผ ํ๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ๊ฐ์ด ์ฐ๊ตฌ์๊ฐ ์๊ธด ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ณด์.
2 0 0 0 1 1 0 0 0 1 0 1 2 0 0 1 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 ์ด๋, 0์ ๋น ์นธ, 1์ ๋ฒฝ, 2๋ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ๊ณณ์ด๋ค. ์๋ฌด๋ฐ ๋ฒฝ์ ์ธ์ฐ์ง ์๋๋ค๋ฉด, ๋ฐ์ด๋ฌ์ค๋ ๋ชจ๋ ๋น ์นธ์ผ๋ก ํผ์ ธ๋๊ฐ ์ ์๋ค. 2ํ 1์ด, 1ํ 2์ด, 4ํ 6์ด์ ๋ฒฝ์ ์ธ์ด๋ค๋ฉด ์ง๋์ ๋ชจ์์ ์๋์ ๊ฐ์์ง๊ฒ ๋๋ค.
2 1 0 0 1 1 0 1 0 1 0 1 2 0 0 1 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ๋ค์ ๋ชจ์ต์ ์๋์ ๊ฐ์์ง๋ค.
2 1 0 0 1 1 2 1 0 1 0 1 2 2 0 1 1 0 1 2 2 0 1 0 0 0 1 2 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 1 0 0 0 0 0 ๋ฒฝ์ 3๊ฐ ์ธ์ด ๋ค, ๋ฐ์ด๋ฌ์ค๊ฐ ํผ์ง ์ ์๋ ๊ณณ์ ์์ ์์ญ์ด๋ผ๊ณ ํ๋ค. ์์ ์ง๋์์ ์์ ์์ญ์ ํฌ๊ธฐ๋ 27์ด๋ค. ์ฐ๊ตฌ์์ ์ง๋๊ฐ ์ฃผ์ด์ก์ ๋ ์ป์ ์ ์๋ ์์ ์์ญ ํฌ๊ธฐ์ ์ต๋๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ง๋์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ด ์ฃผ์ด์ง๋ค. (3 โค N, M โค 8) ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ง๋์ ๋ชจ์์ด ์ฃผ์ด์ง๋ค. 0์ ๋น ์นธ, 1์ ๋ฒฝ, 2๋ ๋ฐ์ด๋ฌ์ค๊ฐ ์๋ ์์น์ด๋ค. 2์ ๊ฐ์๋ 2๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 10๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค. ๋น ์นธ์ ๊ฐ์๋ 3๊ฐ ์ด์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ป์ ์ ์๋ ์์ ์์ญ์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ถ๋ ฅํ๋ค.
์์
์์ 1
์ ๋ ฅ
7 7
2 0 0 0 1 1 0
0 0 1 0 1 2 0
0 1 1 0 1 0 0
0 1 0 0 0 0 0
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 1 0 0 0 0 0
์ถ๋ ฅ
27
์์ 2
์ ๋ ฅ
4 6
0 0 0 0 0 0
1 0 0 0 0 2
1 1 1 0 0 2
0 0 0 0 0 2
์ถ๋ ฅ
9
์์ 3
์ ๋ ฅ
8 8
2 0 0 0 0 0 0 2
2 0 0 0 0 0 0 2
2 0 0 0 0 0 0 2
2 0 0 0 0 0 0 2
2 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
์ถ๋ ฅ
3
My Sol
import sys
input = sys.stdin.readline
def wallsPick(i, start):
global spaces, walls
global cntZero
if i == 3:
mat2 = makeWalls(walls)
runVirus(mat2)
return
for k in range(start, cntZero):
if not visited[k]:
visited[k] = 1
walls.append(spaces[k])
wallsPick(i+1, k+1)
visited[k] = 0
walls.pop()
def makeWalls(walls):
mat2 = [lst[::] for lst in mat]
for wall in walls:
wi, wj = wall
mat2[wi][wj] = 1
return mat2
def runVirus(mat2):
global viruses, H, W
global cntZero, ans
didj = [(-1,0), (1,0), (0,-1), (0,1)]
virusesQ = viruses[::]
cntZero2 = cntZero - 3
start = -1
end = len(virusesQ)
while start < end - 1:
start += 1
vi, vj = virusesQ[start]
for di, dj in didj:
if 0<=vi+di<H and 0<=vj+dj<W:
if not mat2[vi+di][vj+dj]:
mat2[vi+di][vj+dj] = 2
cntZero2 -= 1
virusesQ.append((vi+di, vj+dj))
end += 1
ans = max(cntZero2, ans)
H, W = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(H)]
# ๋ฐ์ด๋ฌ์ค์ ๋น ๊ณต๊ฐ ์์น ํ์ธ
viruses = []
spaces = []
cntZero = 0
for i in range(H):
for j in range(W):
if mat[i][j]==2:
viruses.append((i, j))
elif not mat[i][j]:
spaces.append((i, j))
cntZero += 1
# main ํจ์ ์คํ์ ์ํ ๋ณ์ ์ ์
walls = []
visited = [0]*cntZero
ans = 0
# main ํจ์ ์คํ
wallsPick(0, 0)
print(ans)
์ ๋ ฅ ์ฒ๋ฆฌ
๊ฐ๋ก, ์ธ๋ก, ์ง๋๋ฅผ ๊ฐ๊ฐ W, H, map์ผ๋ก ์ ๋ ฅ์ ๋ฐ์ ํ์์ ๋ง๊ฒ ์ฒ๋ฆฌํ๋ค.
์์ ํ์ : ๋ฐ์ด๋ฌ์ค์ ๋น ๊ณต๊ฐ ์์น ํ์ธ
์นํจ ๋ฐฐ๋ฌ ๋ฌธ์ ์ฒ๋ผ ๋น ๊ณต๊ฐ๊ณผ ๋ฐ์ด๋ฌ์ค ํ์๋ฅผ ๊ฐ๊ฐ 0๊ณผ 2๋ก ๊ตฌ๋ถํด์ ์ขํ๋ฅผ ๋ฐฐ์ด์ ๋ฃ์ด์ค๋ค. ์ด๋ 0์ ๊ฐ์๋ ๋์ค์ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ํ๋ ๋ค์ ๋ฐ๋ก ์ธ์ง ์๊ณ ์ฒ์์ ์ธ์ด์ค ๊ฒ์ผ๋ก๋ถํฐ ๋ฐ์ด๋ฌ์ค๊ฐ ์ ํ๋ ๋๋ง๋ค 1์ ๋นผ์ฃผ์ด ๋์ค์ ๊ณ์ฐํ ํ์๊ฐ ์๋๋ก ํ๋ค.
DFS / STACK / ์กฐํฉ / ๋ธ๋ฃจํธํฌ์ค : 3๊ฐ์ ๋ฒฝ ์ขํ ์ ํ
0์ ์งํฉ์ธ spaces์ ๊ฐ ์ขํ๋ค ์ค์์ 3๊ฐ๋ฅผ ์ ํํ๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด ํจ์๋ฅผ ์งํํ๋ค. DFS๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ ๋ คํ๋ wallsPick()
ํจ์๋ฅผ ์์ฑํ์์ผ๋ฉฐ, ์ธ๋ถ ๋์ ํจ์๋ค์ ๊ฒฝ์ฐ์ ์๋ง๋ค ๋ฐ๋ณต์ํค๋ mainํจ์์ ์ญํ ์ ํ๋ค. ๊ฐ์ฅ ํฐ ์๋ฏธ๋ ์ด๋ฆ์ฒ๋ผ 3๊ฐ์ ๋ฒฝ์ ์ขํ๋ฅผ ์ ํํด ๋ฐฐ์ด์ ๋ฃ๋ ๊ฒ์ ์๋ค.
makeWalls() ํจ์
wallsPick์ ๋ชจ๋ walls์ ๋ํด ์ ๋ฌ๋ฐ์ walls ๋ด์ 3๊ฐ์ ๋ฒฝ ์ขํ๋ฅผ mat์ ๋ํ์ฌ 1๋ก ๊ฐ์ ๋ฃ์ด์ฃผ๋ ์ญํ ์ ํ๋ค. ์ด๋ ์ฃผ์ํ ์ ์ mat์ ์ ์ญ๋ณ์์ด๋ฏ๋ก ์ด ์์ฒด์ ์กฐ์์ ํ๊ฒ ๋๋ค๋ฉด ๋ค๋ฅธ ๊ฒฝ์ฐ์์ mat์ ํ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ mat2๋ฅผ ๋ฐ๋ก ์ ์ํด์ ์ด๋ฅผ ์กฐ์ํ ๋ค, ๋ฐํํด์ฃผ๋ ๊ฒ์ด๋ค.
BFS / QUEUE : runVirus() ํจ์
makeWalls() ํจ์๋ฅผ ํตํด ์ป์ด๋ธ 3๊ฐ์ ๋ฒฝ์ ๋ฐ์ํ mat2 2์ฐจ์ ๋ฐฐ์ด์ ์ ๋ฌ๋ฐ์ virus์ ํ์ฐ์ ์์ํ๋ค. ์ด๋ฏธ mat์ ์ ์ํ ๋๋ถํฐ ์กฐ์ฌ๋ virus์ ์งํฉ viruses๋ฅผ Queue๋ก ์ฌ์ฉํ์ฌ BFS๋ฅผ ์ค์ํ๋ค. ์ด๋ viruses ์ญ์ mat ์ฒ๋ผ ์ ์ญ๋ณ์ ๋ฐฐ์ด์ด๋ฏ๋ก ์ด๋ฅผ ์ง์ ์กฐ์ํ์ง ์๊ณ , virusesQ๋ก deepcopyํ์ฌ ์กฐ์์ ์์ํด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ 0์ ๋ฐ๋ก ์ธ์ด์ฃผ์ง ์๊ธฐ ์ํด ์ ์ญ๋ณ์ cntZero์์ 3์ ๋บ cntZero2๋ฅผ ์ ์ํ์๋ค. 3์ ๋บ ์ด์ ๋ ๋ฒฝ์ ๊ฐ์ 3๊ฐ๊ฐ ์ค์ด๋ค๊ธฐ ๋๋ฌธ์ด๋ค.
Queue์ด๋ฏ๋ก start์ end๋ฅผ ๋ํด๊ฐ๋ฉด์ ๊ฐ๋ฅํ ๋ฐ์ด๋ฌ์ค์ ์์น ์ขํ๋ฅผ Queue์ ๋ฃ๊ณ ๋ฐ์ด๋ฌ์ค์ ์ต๋ํ์ ํ์ฐ์ mat2์ ๋ฐ์ํ๋ค. ํ ๋ฒ ํ์ฐ์ด ๋ ๋๋ง๋ค cntZero2๋ฅผ 1์ฉ ์ค์ฌ์ฃผ์ด start==end๊ฐ ๋๋, ์ฆ Queue๊ฐ ๋น๊ฒ ๋๋ ์ํฉ์์ cntZero2๋ฅผ ํ์ธํด์ฃผ๋ฉด ๋๊ฒ ๋ค.
0์ผ๋ก ์ด๊ธฐํํ ์ ์ญ๋ณ์์ธ ans์ ๋น๊ตํ์ฌ ๋ ํฐ ๊ฐ์ ans์ ์ ์ฅํ๋๋ฐ, ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด์ ๊ฐ์ฅ ํฐ ans๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๊ฒ ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋๊ธ๋จ๊ธฐ๊ธฐ