문제
해결 과정
- bfs함수
- [0][0]부터 큐에 넣고 방문 처리한다.
- while문: 큐가 비어질 때까지 돈다
- 상하좌우를 확인하며 반복문을 돈다.
- 범위 안에 있고 방문하지 않았고
치즈라면 (1보다 크거나 같다면) +1 해준다.
공기라면 (0이라면) 방문처리를 해주고 큐에 넣어준다.
- 여기서!!!! 애초에 큐에 공기만 넣기 때문에 공기의 상하좌우만 확인하게 된다.
- while문: board에 치즈가 없어질 때까지 돈다
- bfs()를 통해 공기에 닿는 치즈를 세어준다.
- 이중포문
- board가 3이상이라면 녹아없어진거니까 0으로 바꾸고
시간이 지났으니까 flag=false
- board가 2라면 치즈인거니까 다시 1로
- flag가 false라면 (시간이 지난 것) t +1
아니라면 더 이상 녹을 게 없는 것이니까 break하고 t를 리턴
시행착오
- 고민1: 정사각형이 2변 이상 공기와 접촉하는 면인지 어떻게 확인할까?
-> bfs
를 이용하여 공기의 상하좌우를 확인하며 치즈라면(1보다 크다면) +1 해준다.
-> 1부터 시작했으니까 3이상이라면 2변 이상 공기와 접촉하는 것
- 고민2: 치즈의 내부에 있는 정사각형인지 어떻게 확인할까?
-> 큐에 치즈를 넣지않기 때문에 치즈의 상하좌우를 방문하지 않는다.
-> 그렇게 되면 내부에 있는 정사각형과 치즈는 아예 방문하지 않는다.
풀이
import sys
from collections import deque
n,m = map(int,sys.stdin.readline().split())
board = [[] for _ in range(n)]
for i in range(n):
board[i] = list(map(int,sys.stdin.readline().split()))
dx = [-1,1,0,0]
dy = [0,0,-1,1]
def bfs():
q = deque([(0,0)])
visited = [[False] * m for _ in range(n)]
visited[0][0] = True
while q:
x,y = q.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if not visited[nx][ny]:
if board[nx][ny] >= 1:
board[nx][ny] += 1
else:
visited[nx][ny] = True
q.append([nx,ny])
t = 0
while True:
bfs()
flag = True
for i in range(n):
for j in range(m):
if board[i][j] >= 3:
board[i][j] = 0
flag = False
elif board[i][j] == 2:
board[i][j] = 1
if not flag:
t += 1
else:
break
print(t)