https://www.acmicpc.net/problem/6593
해당 문제를 본 순간 떠오른 문제가 있다.
https://www.acmicpc.net/problem/7569
바로 이 토마토 문제이다.
보통 bfs 문제들 보면 2차원 배열이라 방향이 4개였는데, 이 문제는 3차원 배열이라 총 방향이 6개를 고려해줘야했다.
이번 포스팅하는 문제 역시, 층이 있기 때문에 방향이 총 6개임을 고려해주어야했다.
정답 코드)
from collections import deque
def bfs(z, x, y):
q = deque()
q.append((z, x, y))
visited[z][x][y] = True
dist[z][x][y] = 0
while q:
z, x, y = q.popleft()
for i in range(6):
nz = z + dz[i]
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nz < L and 0 <= nx < R and 0 <= ny < C:
if graph[nz][nx][ny] == 'E':
return dist[z][x][y] + 1
if graph[nz][nx][ny] == '.' and visited[nz][nx][ny] == False:
visited[nz][nx][ny] = True
dist[nz][nx][ny] = dist[z][x][y] + 1
q.append((nz, nx, ny))
return 0
dx = [-1, 0, 1, 0, 0, 0]
dy = [0, 1, 0, -1, 0, 0]
dz = [0, 0, 0, 0, 1, -1] # 북 동 남 서 상 하
while True:
L, R, C = map(int, input().split())
if (L, R, C) == (0, 0, 0):
break
graph = []
visited = [[[False for _ in range(C)] for _ in range(R)] for _ in range(L)]
dist = [[[-1 for _ in range(C)] for _ in range(R)] for _ in range(L)]
for _ in range(L):
t = []
for _ in range(R):
t.append(list(input()))
graph.append(t)
input() # \n 제거
for i in range(L):
for j in range(R):
for t in range(C):
if graph[i][j][t] == 'S':
result = bfs(i, j, t)
if result == 0:
print("Trapped!")
else:
print("Escaped in {} minute(s).".format(result))
문제 자체는 어렵지는 않았는데.. 아무래도 파이썬 뉴비라 가져가야할 지점들이 보여서 정리한다.
가져가야 할 점)
1. 문자열의 format을 사용해서 값을 넣어보자.
2. 3차원 배열을 입력받을 때, 2차원 배열을 넣고 3차원 배열에 넣어야한다.
3. 공백을 하나 그냥 받아야할 땐 c++의 getChar()처럼 input()으로 처리하자.
'백준 문제풀이' 카테고리의 다른 글
백준 2805번 - 나무 자르기 (python) (1) | 2024.02.01 |
---|---|
백준 2146번 - 다리 만들기(python) (1) | 2024.01.25 |
백준 17298번 - 오큰수(c++) (0) | 2022.09.28 |
소수 관련 문풀 (2581번, 4948번) (0) | 2022.06.01 |