ํ’€์ด


์‹œ๊ฐ„์ด ์ง€๋‚  ๋•Œ ๋งˆ๋‹ค ๋น™์‚ฐ์ด ๋…น๊ณ  ๋น™์‚ฐ์ด 2 ์กฐ๊ฐ ์ด์ƒ ๋ถ„๋ฆฌ๋  ๊ฒฝ์šฐ ๋ช‡ ๋…„์ด ๊ฑธ๋ฆฌ๋Š”์ง€ ๊ณ„์‚ฐํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

1๋…„์ด ์ง€๋‚  ๋•Œ ๋งˆ๋‹ค ๋น™์‚ฐ์ด ๋…น๋Š” ๊ธฐ๋Šฅ์€ โ€œ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•!โ€ ๋ฌธ์ œ.

๋น™์‚ฐ์˜ ์กฐ๊ฐ์„ ์„ธ๋Š” ๊ธฐ๋Šฅ์€ โ€œ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐโ€ ๋ฌธ์ œ.

โ€œ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐโ€ ๋ฌธ์ œ์™€ โ€œ๋ฏธ์„ธ๋จผ์ง€ ์•ˆ๋…•!โ€ ๋ฌธ์ œ๋ฅผ ํ•ฉ์ณ๋†“์€ ๋ฌธ์ œ๊ฐ™๋‹ค.

while๋ฌธ์„ ํ™œ์šฉํ•ด ๋ชจ๋“  ๋น™์‚ฐ์ด ๋…น๊ฑฐ๋‚˜ ๋น™์‚ฐ์ด 2 ์กฐ๊ฐ ์ด์ƒ์œผ๋กœ ๋ถ„๋ฆฌ๋  ๋•Œ ๊นŒ์ง€ ์œ„ ๊ธฐ๋Šฅ์„ ๋ฐ˜๋ณต์‹œํ‚จ๋‹ค.

visited ์™€ new 2 ์ฐจ์› ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™” ํ•ด์ฃผ๋ฉด์„œ 1๋…„ ํ›„ ๋น™์‚ฐ์ด ๋…น์•˜์„ ๋•Œ ์ •๋ณด๋ฅผ new ์— ์ €์žฅํ•ด์ฃผ๊ณ ,

์ด new ๋ฅผ bfs ์— ์ง‘์–ด๋„ฃ์–ด visited ๋ฅผ ํ†ตํ•ด ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค.

bfs ๊ฐ€ ํ•œ ๋ฒˆ ์‹คํ–‰๋  ๋•Œ ๋งˆ๋‹ค ๋น™์‚ฐ ํ•œ ์กฐ๊ฐ์ด ์žˆ๋‹ค๋Š” ์–˜๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ์ด์— ๋งž์ถฐ์„œ piece ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ๊ณ ,

2 ์กฐ๊ฐ ์ด์ƒ์ผ ๊ฒฝ์šฐ ์ข…๋ฃŒ, ์•„๋‹ ๊ฒฝ์šฐ ๋ฐ˜๋ณตํ•˜๋ฉด๋œ๋‹ค.

์†Œ์Šค์ฝ”๋“œ


# ๋น™์‚ฐ
from collections import deque
import sys
input = sys.stdin.readline
 
def bfs(i, j):
    q = deque()
    q.append([i, j])
    visited[i][j] = 1
    while q:
        x, y = q.popleft()
        for k in range(4):
            nx = x + dx[k]
            ny = y + dy[k]
            if 0 <= nx < n and 0 <= ny < m:  # ๋ฒ”์œ„ ๋‚ด์ผ ๋•Œ
                if new[nx][ny] != 0 and visited[nx][ny] == 0:  # ๋น™์‚ฐ์ด ์ด์–ด์ ธ ์žˆ์œผ๋ฉฐ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ
                    q.append([nx, ny])
                    visited[nx][ny] = 1  # ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    return
 
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
 
n, m = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
years = 1
 
while True:
    # ๋น™์‚ฐ์ด ๋‹ค ๋…น์„ ๋•Œ ๊นŒ์ง€ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ
    zero = 0
    for g in graph:
        zero += sum(g)
    if zero == 0:
        print(0)
        break
 
    # ์ดˆ๊ธฐํ™”
    visited = [[0] * m for _ in range(n)]
    new = [[0] * m for _ in range(n)]
    piece = 0
 
    # ์ง€๊ตฌ ์˜จ๋‚œํ™”
    for i in range(n):
        for j in range(m):
            if graph[i][j] != 0:
                temp = graph[i][j]
                for k in range(4):
                    nx = i + dx[k]
                    ny = j + dy[k]
                    if 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 0:
                        temp -= 1
                if temp > 0:
                    new[i][j] = temp
 
    # ๋น™์‚ฐ์ด ๋ช‡ ์กฐ๊ฐ์ธ์ง€ ํ™•์ธ
    for i in range(n):
        for j in range(m):
            if new[i][j] != 0 and visited[i][j] == 0:
                bfs(i, j)
                piece += 1
 
    # ๋น™์‚ฐ์ด ๋ถ„๋ฆฌ๋  ๊ฒฝ์šฐ
    if piece > 1:
        print(years)
        break
 
    # 1๋…„ ํ›„ ๋น™์‚ฐ์ •๋ณด ์—…๋ฐ์ดํŠธ
    years += 1
    graph = new

References