[BOJ][๐ก5][๋ฐฑ์ค#07576] ํ ๋งํ
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์ฒ ์์ ํ ๋งํ ๋์ฅ์์๋ ํ ๋งํ ๋ฅผ ๋ณด๊ดํ๋ ํฐ ์ฐฝ๊ณ ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ํ ๋งํ ๋ ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ฒฉ์ ๋ชจ์ ์์์ ์นธ์ ํ๋์ฉ ๋ฃ์ด์ ์ฐฝ๊ณ ์ ๋ณด๊ดํ๋ค.ย
์ฐฝ๊ณ ์ ๋ณด๊ด๋๋ ํ ๋งํ ๋ค ์ค์๋ ์ ์ต์ ๊ฒ๋ ์์ง๋ง, ์์ง ์ต์ง ์์ ํ ๋งํ ๋ค๋ ์์ ์ ์๋ค. ๋ณด๊ด ํ ํ๋ฃจ๊ฐ ์ง๋๋ฉด, ์ต์ ํ ๋งํ ๋ค์ ์ธ์ ํ ๊ณณ์ ์๋ ์ต์ง ์์ ํ ๋งํ ๋ค์ ์ต์ ํ ๋งํ ์ ์ํฅ์ ๋ฐ์ ์ต๊ฒ ๋๋ค. ํ๋์ ํ ๋งํ ์ ์ธ์ ํ ๊ณณ์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ, ์, ๋ค ๋ค ๋ฐฉํฅ์ ์๋ ํ ๋งํ ๋ฅผ ์๋ฏธํ๋ค. ๋๊ฐ์ ๋ฐฉํฅ์ ์๋ ํ ๋งํ ๋ค์๊ฒ๋ ์ํฅ์ ์ฃผ์ง ๋ชปํ๋ฉฐ, ํ ๋งํ ๊ฐ ํผ์ ์ ์ ๋ก ์ต๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ์ฒ ์๋ ์ฐฝ๊ณ ์ ๋ณด๊ด๋ ํ ๋งํ ๋ค์ด ๋ฉฐ์น ์ด ์ง๋๋ฉด ๋ค ์ต๊ฒ ๋๋์ง, ๊ทธ ์ต์ ์ผ์๋ฅผ ์๊ณ ์ถ์ด ํ๋ค. ํ ๋งํ ๋ฅผ ์ฐฝ๊ณ ์ ๋ณด๊ดํ๋ ๊ฒฉ์๋ชจ์์ ์์๋ค์ ํฌ๊ธฐ์ ์ต์ ํ ๋งํ ๋ค๊ณผ ์ต์ง ์์ ํ ๋งํ ๋ค์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ๋ฉฐ์น ์ด ์ง๋๋ฉด ํ ๋งํ ๋ค์ด ๋ชจ๋ ์ต๋์ง, ๊ทธ ์ต์ ์ผ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. ๋จ, ์์์ ์ผ๋ถ ์นธ์๋ ํ ๋งํ ๊ฐ ๋ค์ด์์ง ์์ ์๋ ์๋ค.
์ ๋ ฅ
์ฒซ ์ค์๋ ์์์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ M,N์ด ์ฃผ์ด์ง๋ค. M์ ์์์ ๊ฐ๋ก ์นธ์ ์, N์ ์์์ ์ธ๋ก ์นธ์ ์๋ฅผ ๋ํ๋ธ๋ค. ๋จ, 2 โค M,N โค 1,000 ์ด๋ค. ๋์งธ ์ค๋ถํฐ๋ ํ๋์ ์์์ ์ ์ฅ๋ ํ ๋งํ ๋ค์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ์ฆ, ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์์์ ๋ด๊ธด ํ ๋งํ ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ํ๋์ ์ค์๋ ์์ ๊ฐ๋ก์ค์ ๋ค์ด์๋ ํ ๋งํ ์ ์ํ๊ฐ M๊ฐ์ ์ ์๋ก ์ฃผ์ด์ง๋ค. ์ ์ 1์ ์ต์ ํ ๋งํ , ์ ์ 0์ ์ต์ง ์์ ํ ๋งํ , ์ ์ -1์ ํ ๋งํ ๊ฐ ๋ค์ด์์ง ์์ ์นธ์ ๋ํ๋ธ๋ค. ํ ๋งํ ๊ฐ ํ๋ ์ด์ ์๋ ๊ฒฝ์ฐ๋ง ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฌ๋ฌ๋ถ์ ํ ๋งํ ๊ฐ ๋ชจ๋ ์ต์ ๋๊น์ง์ ์ต์ ๋ ์ง๋ฅผ ์ถ๋ ฅํด์ผ ํ๋ค. ๋ง์ฝ, ์ ์ฅ๋ ๋๋ถํฐ ๋ชจ๋ ํ ๋งํ ๊ฐ ์ต์ด์๋ ์ํ์ด๋ฉด 0์ ์ถ๋ ฅํด์ผ ํ๊ณ , ํ ๋งํ ๊ฐ ๋ชจ๋ ์ต์ง๋ ๋ชปํ๋ ์ํฉ์ด๋ฉด -1์ ์ถ๋ ฅํด์ผ ํ๋ค.
์์
์์ 1
์ ๋ ฅ
6 4
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1
์ถ๋ ฅ
8
์์ 2
์ ๋ ฅ
6 4
0 -1 0 0 0 0
-1 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 1
์ถ๋ ฅ
-1
์์ 3
์ ๋ ฅ
6 4
1 -1 0 0 0 0
0 -1 0 0 0 0
0 0 0 0 -1 0
0 0 0 0 -1 1
์ถ๋ ฅ
6
์์ 4
์ ๋ ฅ
5 5
-1 1 0 0 0
0 -1 -1 -1 0
0 -1 -1 -1 0
0 -1 -1 -1 0
0 0 0 0 0
์ถ๋ ฅ
14
์์ 5
์ ๋ ฅ
2 2
1 -1
-1 1
์ถ๋ ฅ
0
My Sol
import sys
sys.setrecursionlimit(100000)
input = sys.stdin.readline
def isThereZero():
global mat, H, W
for i in range(H):
for j in range(W):
if not mat[i][j]:
return 1
return 0
def bfs(days, ni, nj):
global Q, H, W, end, ans
global mat
didj = [(-1, 0), (1, 0), (0, -1), (0, 1)]
for di, dj in didj:
if 0<=ni+di<H and 0<=nj+dj<W:
if not mat[ni+di][nj+dj]:
mat[ni+di][nj+dj] = days+1
if ans < days+1:
ans = days+1
Q.append((days+1, ni+di, nj+dj))
end += 1
W, H = map(int, input().split())
mat = [list(map(int, input().split())) for _ in range(H)]
# 0. 0์ด ์์ผ๋ฉด 0 ์ถ๋ ฅ
if not isThereZero():
print(0)
quit()
# 1. ๋ชจ๋ 1์ ์ขํ์ depth(0)๋ฅผ Q์ ๋ฃ์
start = -1
end = 0
Q = []
for i in range(H):
for j in range(W):
if mat[i][j]==1:
Q.append((0, i, j))
end += 1
# 2. ๊ณ์ฐ
ans = 0
while start < end-1:
start += 1
bfs(*Q[start])
# 3. 0 ์๋์ง ํ์ธ
if isThereZero():
print(-1)
quit()
# 4. ans ์ถ๋ ฅ
print(ans)
bfs์ queue๋ฅผ ์ฌ์ฉํ๋ ํ์ด์ด๋ค. ์ ๋ ฅ์ ์ฒ๋ฆฌํด์ฃผ๊ณ , 2์ฐจ์ ๋ฐฐ์ด mat์ด ๋ง๋ จ๋๋ฉด, ์ด ๋ฐฐ์ด์ 0์ด ์๋์ง ํ์ธํ๋ isThereZero() ํจ์๋ฅผ ํธ์ถํ๋ค. ์ด ํจ์ ๋ด๋ถ์์๋ ๋ชจ๋ ์นธ์ ๋ํ์ฌ ์กฐํ๋ฅผ ํ๋ค๊ฐ 0์ด ๋์ค๋ฉด 1์ ๋ฐํํ๊ณ , ๋๊น์ง 0์ด ๋์ค์ง ์์ผ๋ฉด 0์ ๋ฐํํ๋ค.
๋ง์ฝ 0์ ๋ฐํํ๋ค๋ฉด ์ฒ์๋ถํฐ ์ต์ด์ผ ํ ํ ๋งํ ๊ฐ ์๋ค๋ ์๊ธฐ์ด๋ฏ๋ก, 0์ ์ถ๋ ฅํ๊ณ ์ข ๋ฃํ๋ค.
๋ง์ฝ 0์ด ์กด์ฌํ๋ค๋ฉด, ์ฆ ์ตํ์ผ ํ ํ ๋งํ ๊ฐ ์๋ค๋ฉด mat ๋ด์ ๋ชจ๋ ์นธ์ ์กฐํํ๋ฉด ๊ฐ์ด 1์ด๋ฉด ํด๋น ์ขํ์ depth์ธ 0์ ํจ๊ป Q์ ์ ์ฅํ๊ณ , end๋ฅผ 1 ๋๋ ค์ค๋ค. ์ด end๋ ์ดํ์ while๋ฌธ์ ๋๋ฆด ๋ ์ข ๋ฃ ์กฐ๊ฑด์ ์ํด ์ฌ์ฉ๋๋ค.
queue๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์กฐํ ์ธ๋ฑ์ค์ธ start์, queue์ ๋ ์ธ๋ฑ์ค์ธ end-1์ด ์ผ์นํ๋ฉด start+=1์ ์ํด ์ธ๋ฑ์ค๊ฐ ๋์ด๊ฐ๊ฒ ๋๋ฏ๋ก, ๊ทธ ์ด์ ๊น์ง๋ง while๋ฌธ์ ๋ฐ๋ณตํ๋ ๊ฒ์ผ๋ก ์ค์ ํ๋ค. start๋ฅผ ๋ฐ๋ก 1 ๋๋ ค 0๋ถํฐ ์์ํ๋ฉฐ, Q์ 0๋ฒ ์ธ๋ฑ์ค tuple๋ถํฐ ๊ฐ์ ธ์ ์ ๋ณด๋ฅผ bfs ํจ์ ๋ด๋ถ๋ก ์ ๋ฌํด์ค๋ค.
์ด ํจ์ ๋ด๋ถ์์๋ ํด๋น ์ขํ์ ์ํ์ข์ฐ ์ขํ ๊ฐ๊ฐ์ ๋ํ์ฌ ์ด๊ฒ๋ค์ด ๋ฒ์ ๋ด์ ์๊ณ , 0์ ๊ฐ์ ๊ฐ์ง๋ฉด, days์ 1์ ๋ํ ๊ฐ์ ๋ฃ๊ณ Q์ days+1, ์ขํ๋ฅผ ํจ๊ป ์ ์ฅํ๋ค. ์ด๋ Q๋ฅผ ๋๋ฉฐ ์ดํ์ ๋ค์ ์ํ์ข์ฐ๋ฅผ ์กฐํํ๋ ๊ธฐ์ค์ ์ผ๋ก์ ์ฌ์ฉ๋ ๊ฒ์ด๋ค. ์ด๋ 0์ผ๋ก ์ด๊ธฐํ๋ ans๋ณด๋ค ๊ฐ์ด 0์ธ ์ํ์ข์ฐ์ ๋ฃ๋ days+1์ ๊ฐ์ด ๋ ํฌ๋ฉด ์ด๋ฅผ ans๋ก ๊ฐฑ์ ํ๋ค. ์ด๋ ์ต์์ผ์๋ก์จ ์ฌ์ฉํ ์ ์๋ค.
์ด๋ ํ ๊ฒฝ์ฐ๋ Q์ append๋ฅผ ํ ๋๋ง๋ค end๋ฅผ ๋๋ ค์ฃผ์ด์ผ Q์ ๋๊น์ง start๊ฐ ์ด๋ํ๋ฉฐ ๋ชจ๋ ์กฐํํ ์ ์๊ฒ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๊ฐ๋ฅํ Q๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ค๋ฉด, mat ์ ์ฒด์์ 0์ด ์๋์ง isThereZero() ํจ์๋ก ๋ค์ ํ์ธํ๋ค. ๋ง์ฝ 0์ด ์๋ค๋ฉด ์ด๋ ํ -1์ ์ํด ๋งํ์ ์ตํ ์ ์๋ ์ํฉ์ด๋ฏ๋ก -1์ ์ถ๋ ฅํ๊ณ ์ข ๋ฃํ๋ค. ๋ง์ฝ ์ด ๋ชจ๋ ์กฐ๊ฑด์ ํต๊ณผํ๋ค๋ฉด ๊ทธ๋ฅ ๋ชจ๋ ์ตํ๋ ๋ฐ์ ํ์ํ๋ ์ต์์ผ์์ธ ans๋ฅผ ์ถ๋ ฅํ๋ฉด ๋๊ฒ ๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
๋ชจ๋ฒ๋ต์
from collections import deque
graph = []
m, n = map(int, input().split())
for _ in range(n):
graph.append(list(map(int, input().split())))
def bfs():
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= n or ny < 0 or ny >= m:
continue
if graph[nx][ny] == 0:
graph[nx][ny] = graph[x][y] + 1
queue.append((nx, ny))
queue = deque()
for a in range(n):
for b in range(m):
if graph[a][b] == 1:
queue.append((a,b))
bfs()
result = 0
for i in graph:
if 0 in i:
print(-1)
exit()
result = max(result, max(i))
print(result - 1)
deque ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด๋ค. ์ฝ๋ฉํ ์คํธ๋ฅผ ๋๋นํ ์๊ณ ๋ฆฌ์ฆ ํ์ด์์๋ ๋ง์ ๋ถ๋ถ์ด ์ ํ๋๋ฏ๋ก, ๋๋๋ก ์ฌ์ฉํ์ง ์์ ๊ฒ์ด์ง๋ง, ํ์ด๊ฐ ์งง๊ณ , ์ฐ์ฐ์๊ฐ๋ ์งง์์ ์ฐธ๊ณ ์ฉ์ผ๋ก ๊ฐ์ ธ์๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ