Algorithm/백준_생각정리

백준_7576_토마토(python)

코친남 2023. 2. 16. 16:23

 예전에 한 번 풀었었는데 스터디로 인해 한번 더 풀게 됐다. 한번 풀어보기도 했고 간단한 탐색 문제였기에 자신있게 풀었지만 92%에서 틀렸다고 나왔다. 알고리즘적으로 틀릴 이유가 없다고 생각해서 많이 헤맸다.

 

풀이

익은 토마토들을 한 번에 영향력을 주기 때문에 처음에 1이 어디있었는지 다 찾아서 deque에다가 넣는다.

그 다음에 순서대로 하나씩 꺼내어 주변 익지 않은 토마토가 있다면 현재 좌표에서 +1을 해서 토마토를 익게 해주고 이제 이 토마토도 deque에 넣는다.

 

헤맸던 지점

if flag == 1:이라는 조건을 한번 더 체크해줬어야 했는데 누락시켰다.  옜날이었으면 이런데서 실수하지 않고 오히려 구현을 못했을 텐데 반대가 됐다. 세세한 부분도 신경을 쓰는 습관을 들여야겠다.

from collections import deque

m,n = map(int,input().split())

data = [list(map(int,input().split())) for _ in range(n)]

tomato = deque()

dx = [-1,1,0,0]
dy = [0,0,-1,1]

def bfs(data,tomato):
    while tomato:
        x,y = tomato.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < m and data[nx][ny] == 0:
                tomato.append((nx,ny))
                data[nx][ny] = data[x][y] + 1


for i in range(n):
    for j in range(m):
        if data[i][j] == 1:
            tomato.append((i,j))

bfs(data,tomato)
result = max(map(max,data))
flag = 0
for i in range(n):
    for j in range(m):
        if data[i][j] == 0:
            flag = 1
            print(-1)
            break
    if flag == 1:
        break
if flag == 0:
    print(result - 1)