[백준] 7569 토마토(Python)

수경·2023년 5월 4일
0

problem solving

목록 보기
142/174

백준 - 7569 토마토

풀이

토마토 상자가 여러 상자이기 때문에 3차원 배열을 사용했다.
기존 bfs방식대로 했고, 3차원 배열임을 고려해 dx, dy, dz를 만들어서 6가지 방향을 움직일 수 있도록 사용함.

삽질

거의 같은 방식이라 문제 풀이 자체는 어렵지 않았지만, bfs를 모두 돌고 답을 도출하는 과정에서 애를 먹었다.

처음 제출했던 코드는 아래 코드와 같이 bfs를 돌린 후에 그래프에 0이 있으면 answer에 0을 저장하고 for문을 중단하여 결론적으로 -1을 출력하는 코드였다.

bfs()

answer = 0
for i in graph:
	for j in i:
		if 0 in j:
			answer = 0
			break
		answer = max(answer, max(j))
print(answer - 1)

문제에 쓰인 예시와 질문하기에 있는 반례들 모두 통과가 됐지만, 정작 문제를 통과하진 못했다.
모든 예시와 반례를 통과했으니 뭐가 문젠지 감이 잘 오지 않았다... 디버깅도 의미없고.....
이것 저것 해보다가 결국 break 문제라는 걸 알았다.
break가 하나의 for문을 탈출하기 때문에 이중for문 코드를 아예 탈출할 순 없었기 때문에 반례가 존재해서 틀렸던 것..................................
그래서 바로 -1을 출력하고 종료하도록 고쳤더니 통과했다.............

break........ 가만안둬


코드

from sys import stdin
from collections import deque

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

queue = deque([])

def bfs():
	while queue:
		x, y, z = queue.popleft()
		for i in range(6):
			nx = x + dx[i]
			ny = y + dy[i]
			nz = z + dz[i]
			if 0 <= nx < h and 0 <= ny < n and 0 <= nz < m and not graph[nx][ny][nz]:
				graph[nx][ny][nz] = graph[x][y][z] + 1
				queue.append([nx, ny, nz])

m, n, h = map(int, stdin.readline().split())
graph = [[list(map(int, stdin.readline().split())) for _ in range(n)] for _ in range(h)]

for i in range(h):
	for j in range(n):
		for k in range(m):
			if graph[i][j][k] == 1:
				queue.append([i, j, k])
bfs()

answer = 0
for i in graph:
	for j in i:
		if 0 in j:
			print(-1)
			exit(0)
		answer = max(answer, max(j))
print(answer - 1)
profile
어쩌다보니 tmi뿐인 블로그😎

0개의 댓글