문제요약


나의 코드 및 설명
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차원 리스트를 연습할 수 있어서 좋았고, 며칠 뒤에 다시 한 번 풀어봐야겠다.
'Baekjoon > DFS와 BFS' 카테고리의 다른 글
[백준] 1743 음식물 피하기 (실버1) / DFS (1) | 2023.04.30 |
---|---|
🥇[백준] 10026 적록색약 (골드5) / BFS (0) | 2023.04.30 |
🥇[백준] 7576 토마토 (골드5) / BFS (0) | 2023.04.30 |
[백준] 2468 안전 영역 (실버1) / BFS (0) | 2023.04.26 |
[백준] 11724 연결 요소의 개수 (실버2) / DFS (0) | 2023.04.26 |
문제요약


나의 코드 및 설명
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차원 리스트를 연습할 수 있어서 좋았고, 며칠 뒤에 다시 한 번 풀어봐야겠다.
'Baekjoon > DFS와 BFS' 카테고리의 다른 글
[백준] 1743 음식물 피하기 (실버1) / DFS (1) | 2023.04.30 |
---|---|
🥇[백준] 10026 적록색약 (골드5) / BFS (0) | 2023.04.30 |
🥇[백준] 7576 토마토 (골드5) / BFS (0) | 2023.04.30 |
[백준] 2468 안전 영역 (실버1) / BFS (0) | 2023.04.26 |
[백준] 11724 연결 요소의 개수 (실버2) / DFS (0) | 2023.04.26 |