๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“Š Algorithm/BOJ

โœ… BOJ 2638 - BFS ์‘์šฉ

by huis_log 2025. 7. 17.

๋ฌธ์ œ ์š”์•ฝ

์™ธ๋ถ€ ๊ณต๊ธฐ๋ž‘ ๋‘ ๋ฉด ์ด์ƒ ๋งž๋‹ฟ์œผ๋ฉด ์น˜์ฆˆ๊ฐ€ ๋…น์Œ. ๋‚ด๋ถ€์— ๊ฐ‡ํžŒ ๊ณต๊ธฐ๋Š” ์™ธ๋ถ€ ๊ณต๊ธฐ ์ทจ๊ธ‰ ์•ˆ ํ•จ. ์น˜์ฆˆ ๋‹ค ์—†์–ด์งˆ ๋•Œ๊นŒ์ง€ ์‹œ๊ฐ„ ์„ธ์„œ ์ถœ๋ ฅํ•˜๋ฉด ๋์ž„.

์™ธ๋ถ€ ๊ณต๊ธฐ ๊ตฌ๋ถ„

๋งค ๋ผ์šด๋“œ๋งˆ๋‹ค (0,0)์—์„œ BFS ๋Œ๋ ค์„œ ์™ธ๋ถ€ ๊ณต๊ธฐ๋งŒ True๋กœ ๋งˆํ‚นํ•ด๋‘ฌ์•ผ ํ•จ. ๋‚ด๋ถ€์— ๊ฐ‡ํžŒ 0๊นŒ์ง€ ์™ธ๋ถ€๋กœ ์ณค๋‹ค๊ฐ„ ๋ฐ”๋กœ ์˜ค๋‹ตํ–‰.

์น˜์ฆˆ ๋…น์ด๊ธฐ ๋กœ์ง

๊ทธ๋ฆฌ๋“œ ์ „์ฒด ์ˆœํšŒํ•˜๋ฉด์„œ ์น˜์ฆˆ(1) ๋งŒ๋‚˜๋ฉด ์‚ฌ๋ฐฉ ๋‹ค ํ™•์ธํ•ด์„œ ์™ธ๋ถ€๊ณต๊ธฐ๋ž‘ ๋‹ฟ๋Š” ๋ฉด ๋ช‡ ๊ฐœ์ธ์ง€ ์„ธ๋ผ. ๋‘ ๊ฐœ ์ด์ƒ์ด๋ฉด ๊ทธ ์นธ ์ด๋ฒˆ ๋ผ์šด๋“œ์—์„œ ๋ฐ”๋กœ ๋…น์ธ๋‹ค. ๊ทธ ์™ธ์—๋Š” ์‹ ๊ฒฝ ๊บผ๋„ ๋จ.

๋ฐ˜๋ณต & ์ข…๋ฃŒ

ํ•œ ๋ฒˆ ๋Œ๋ฆด ๋•Œ๋งˆ๋‹ค ์‹œ๊ฐ„+1 ํ•˜๊ณ , ์น˜์ฆˆ ๋‹ค ์‚ฌ๋ผ์ง€๋ฉด ๊ทธ๋•Œ while๋ฌธ ๋๋‚ด๊ณ  ์‹œ๊ฐ„๋งŒ ์ถœ๋ ฅํ•˜๋ฉด ๋จ. for๋ฌธ ์ค‘๊ฐ„์— break, else ์“ฐ๋ฉด ์ƒํƒœ ๊ผฌ์ด๋‹ˆ๊นŒ ๊ทธ๋Ÿฐ ๊ฑฐ ์“ฐ์ง€ ๋ง๊ณ  ๋„ค ๋ฐฉํ–ฅ ๋‹ค ํ™•์ธํ•œ ๋’ค์— ์ฒ˜๋ฆฌํ•˜๊ธฐ.


BFS์—ฌ์„œ ์•„์ด๋””์–ด ์ž์ฒด๋Š” ์–ด๋ ต์ง€ ์•Š์•˜๋˜ ๋ฌธ์ œ. ๊ตฌํ˜„์ด ๊ท€์ฐฎ์•˜์Œ.

# bfs: ์™ธ๋ถ€๊ณต๊ธฐ ๋ผ์šด๋“œ๋งˆ๋‹ค ํŒ๋ณ„ํ•˜๊ธฐ
from collections import deque
import sys
input=sys.stdin.readline

# ๋งค ๋ผ์šด๋“œ๋งˆ๋‹ค ์™ธ๋ถ€ ๊ณต๊ธฐ์ธ์ง€, ๋‚ด๋ถ€ ๊ณต๊ธฐ์ธ์ง€๋ฅผ ํŒ๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
def bfs_outer_air(grid):
    start_y,start_x=0,0
    directions=[(0,1),(-1,0),(0,-1),(1,0)]
    row=len(grid)
    col=len(grid[0])
    
    outer_air=[[False]*col for _ in range(row)]
    outer_air[start_y][start_x]=True
    q=deque()
    q.append((start_y,start_x))
    
    while q:
        cy,cx=q.popleft()
        
        for dy,dx in directions:
            ny=cy+dy
            nx=cx+dx
            if 0<=ny<row and 0<=nx<col:
                if outer_air[ny][nx]==False and grid[ny][nx]!=1:
                    outer_air[ny][nx]=True
                    q.append((ny,nx))
        
    return outer_air

# ๊ทธ๋ฆฌ๋“œ๊ฐ€ ๋น„์—ˆ๋Š”์ง€ ํŒ๋ณ„ํ•ฉ๋‹ˆ๋‹ค.
def is_empty_grid(grid):
    for row in grid:
        for block in row:
            if block==1:
                return False
    return True

# ์ตœ์ข… ์‹œ๊ฐ„ ๊ณ„์‚ฐ
def cal_total_time(grid,n,m):
    dirs=[(0,1),(-1,0),(0,-1),(1,0)]
    total_time=0
    
    while True:
        if is_empty_grid(grid):
            break
        
        outer_air=bfs_outer_air(grid)
        new_grid=[row[:] for row in grid] #deepcopy
        for i in range(n):
            for j in range(m):
                if grid[i][j]==1:
                    cnt=0
                    for di,dj in dirs:
                        ni,nj=i+di,j+dj
                        if 0<=ni<n and 0<=nj<m:
                            if grid[ni][nj]==0 and outer_air[ni][nj]:
                                cnt+=1
                    if cnt>=2:
                        new_grid[i][j]=0
        total_time+=1
        grid=[row[:] for row in new_grid]
    
    return total_time

def main():
    n,m=map(int,input().split())
    grid=[list(map(int,input().split())) for _ in range(n)]
    print(cal_total_time(grid,n,m))
    
if __name__=="__main__":
    main()
๋ฐ˜์‘ํ˜•