Baekjoon/DFS와 BFS

🥇[백준] 7569 토마토 (골드5) / BFS, 3차원 리스트

hellosonic 2023. 4. 30. 16:12

문제요약

나의 코드 및 설명

import sys
from collections import deque

def bfs():
    global days
    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 nx<0 or ny<0 or nz<0 or nx>=m or ny>=n or nz>=h:
                continue
            else:
                #다음 좌표가 아직 익지 않은 토마토(0)이고, 방문하지 않았다면,
                if board[nz][ny][nx] == 0 and visited[nz][ny][nx] == 0:
                    #토마토가 익는다.
                    board[nz][ny][nx] = 1
                    #다음 좌표의 방문 테이블 값은 현재 좌표 값 + 1
                    visited[nz][ny][nx] = visited[z][y][x] + 1
                    #날짜 변수에 저장
                    days = visited[nz][ny][nx]
                    #다음 좌표를 큐에 넣는다
                    queue.append((nx, ny, nz))

m,n,h = map(int, input().split()) #m:가로 / n:세로 / h:높이

#입력값 3차원 리스트에 저장
board = [[list(map(int, sys.stdin.readline().split())) for _ in range(n)] for _ in range(h)]

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

#3차원 방문 리스트 초기화 
visited = [[[0]*m for _ in range(n)] for _ in range(h)]

days = 0

queue = deque()

#먼저, 익은 토마토가 있는 좌표를 찾아낸다.
for i in range(h):
    for j in range(n):
        for k in range(m):
            if board[i][j][k] == 1:
                queue.append((k,j,i)) #가로,세로,높이

bfs() #bfs 함수 실행
ans = days

for i in range(h):
    for j in range(n):
        for k in range(m):
            if board[i][j][k] == 0:
                ans = -1
                break
        if ans == -1:
            break
    if ans == -1:
        break

print(ans)

3차원 리스트 : [[[0 for _ in range(가로)] for _ in range(세로)] for _ in range(높이)]

##3차원 리스트 입력

[[list(map(int, input().split())) for _ in range(세로)] for _ in range(h)]

피드백

이전에 풀은 백준 7576 토마토 문제와 비슷하지만 3차원 리스트를 활용해야 하는 문제. 3차원 리스트를 연습할 수 있어서 좋았고, 며칠 뒤에 다시 한 번 풀어봐야겠다.