[BOJ][๐ŸŸก5][๋ฐฑ์ค€#07576] ํ† ๋งˆํ† 

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #7576


๋ฌธ์ œ

์ฒ ์ˆ˜์˜ ํ† ๋งˆํ†  ๋†์žฅ์—์„œ๋Š” ํ† ๋งˆํ† ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ํฐ ์ฐฝ๊ณ ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํ† ๋งˆํ† ๋Š” ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฒฉ์ž ๋ชจ์–‘ ์ƒ์ž์˜ ์นธ์— ํ•˜๋‚˜์”ฉ ๋„ฃ์–ด์„œ ์ฐฝ๊ณ ์— ๋ณด๊ด€ํ•œ๋‹ค.ย 

์ฐฝ๊ณ ์— ๋ณด๊ด€๋˜๋Š” ํ† ๋งˆํ† ๋“ค ์ค‘์—๋Š” ์ž˜ ์ต์€ ๊ฒƒ๋„ ์žˆ์ง€๋งŒ, ์•„์ง ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๋“ค๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋ณด๊ด€ ํ›„ ํ•˜๋ฃจ๊ฐ€ ์ง€๋‚˜๋ฉด, ์ต์€ ํ† ๋งˆํ† ๋“ค์˜ ์ธ์ ‘ํ•œ ๊ณณ์— ์žˆ๋Š” ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๋“ค์€ ์ต์€ ํ† ๋งˆํ† ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ์ต๊ฒŒ ๋œ๋‹ค. ํ•˜๋‚˜์˜ ํ† ๋งˆํ† ์˜ ์ธ์ ‘ํ•œ ๊ณณ์€ ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, ์•ž, ๋’ค ๋„ค ๋ฐฉํ–ฅ์— ์žˆ๋Š” ํ† ๋งˆํ† ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์— ์žˆ๋Š” ํ† ๋งˆํ† ๋“ค์—๊ฒŒ๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ๋ชปํ•˜๋ฉฐ, ํ† ๋งˆํ† ๊ฐ€ ํ˜ผ์ž ์ €์ ˆ๋กœ ์ต๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์ฒ ์ˆ˜๋Š” ์ฐฝ๊ณ ์— ๋ณด๊ด€๋œ ํ† ๋งˆํ† ๋“ค์ด ๋ฉฐ์น ์ด ์ง€๋‚˜๋ฉด ๋‹ค ์ต๊ฒŒ ๋˜๋Š”์ง€, ๊ทธ ์ตœ์†Œ ์ผ์ˆ˜๋ฅผ ์•Œ๊ณ  ์‹ถ์–ด ํ•œ๋‹ค. ํ† ๋งˆํ† ๋ฅผ ์ฐฝ๊ณ ์— ๋ณด๊ด€ํ•˜๋Š” ๊ฒฉ์ž๋ชจ์–‘์˜ ์ƒ์ž๋“ค์˜ ํฌ๊ธฐ์™€ ์ต์€ ํ† ๋งˆํ† ๋“ค๊ณผ ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๋“ค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ฉฐ์น ์ด ์ง€๋‚˜๋ฉด ํ† ๋งˆํ† ๋“ค์ด ๋ชจ๋‘ ์ต๋Š”์ง€, ๊ทธ ์ตœ์†Œ ์ผ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ. ๋‹จ, ์ƒ์ž์˜ ์ผ๋ถ€ ์นธ์—๋Š” ํ† ๋งˆํ† ๊ฐ€ ๋“ค์–ด์žˆ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.


์ž…๋ ฅ

์ฒซ ์ค„์—๋Š” ์ƒ์ž์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ •์ˆ˜ 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 ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋ฅผ ๋Œ€๋น„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด์—์„œ๋Š” ๋งŽ์€ ๋ถ€๋ถ„์ด ์ œํ•œ๋˜๋ฏ€๋กœ, ๋˜๋„๋ก ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด์ง€๋งŒ, ํ’€์ด๊ฐ€ ์งง๊ณ , ์—ฐ์‚ฐ์‹œ๊ฐ„๋„ ์งง์•„์„œ ์ฐธ๊ณ ์šฉ์œผ๋กœ ๊ฐ€์ ธ์™”๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ