https://www.acmicpc.net/problem/2636
"""
1. 아이디어
(0, 0) 부터 bfs를 탐색하면서 상하좌우를 확인하여 공기(0)이면 큐에 넣어 계속 탐색을 한다.
그러다 치즈(1)를 만나면 치즈가 있던 자리를 0으로 만들고 방문처리를 한다.
한번의 탐색이 끝나면 치즈가 녹은 개수를 빈 리스트에 집어넣고 개수를 반환한다.
치즈가 녹은 개수가 0이면 다 녹았다는 말이므로 탐색을 종료한다.
2. 시간복잡도
O(NM * time) 인거 같은데 가로 세로 길이가 100이고 time은 음.. 길어야 10을 안넘기지 않나?
근데 time이 100이 된다고 해도 뭐 통과되니깐 그냥 코드 작성했다.
"""
from sys import stdin
from collections import deque
input = stdin.readline
n, m = map(int, input().split())
map = [ list(map(int, input().split())) for _ in range(n) ]
time = 0
answer = []
dx, dy = [0, 0, -1, 1], [-1, 1, 0, 0]
def bfs():
visited = [[False] * m for _ in range(n)] # bfs 탐색할때마다 방문여부는 초기화 해줘야함
visited[0][0] = True
q = deque([(0, 0)])
cnt = 0
while q:
px, py = q.popleft()
for k in range(4):
mx = px + dx[k]
my = py + dy[k]
if 0 <= mx < n and 0 <= my < m:
if map[mx][my] == 0 and not visited[mx][my]:
visited[mx][my] = True
q.append((mx, my))
elif map[mx][my] == 1: # 1인 경우는 굳이 방문여부 체크 안해도 됨.
map[mx][my] = 0
visited[mx][my] = True
cnt += 1
answer.append(cnt)
return cnt
while 1:
time += 1
flag = bfs()
if flag == 0:
break
print(time-1)
print(answer[-2])
쉬운 문제인거 같은데 처음에 map에서 2차원 배열 입력받을 때 실수해서 한참을 디버깅 했다. 근데 map 입력부터 잘못하니깐 파이참에서 디버깅할 부분을 잘 못 짚어줘서 몇분을 낭비했는데 앞으로 쉬운 부분에서 실수하지말자;;