https://www.acmicpc.net/problem/6593
1. 해결방법
상 하 좌 우 위 아래 6 방향으로 탐색해야하므로 당연히 BFS 문제이며, q를 이용해서 z, y, x 인덱스 뿐만 아니라 time 이라는 변수까지 추가해서 q에 담아내는 노하우가 있으면 좋을지도..?
문제 글을 잘 읽자.. 입력 관련 글을 안봐서 입력에 시간 다 보냈다;;;
1. L, R, C가 0을 입력받을 때, 종료되야 하므로 while문을 이용해서 무한 반복을 하고, 2차원 배열을 입력받아 maps라는 배열에 append 하는 방식으로 해서 3차원 배열을 만들자. 중간에 공백 줄도 있으므로 input()이라는 코드를 작성해서 공백 줄을 날려주자.
2. 2중 for문으로 스타트지점인 'S'를 찾고, 인덱스 값을 가지고 bfs를 돌려주자.
3. 큐(q)에는 매개변수로 전달받은 인덱스 값과 time을 0으로 초기화 해서 첫 append를 한다.
4. q에 값을 하나씩 꺼내서 6방향 모두 탐색해주고 유효성 검사를 해준다.
5. 유효성 검사 후, 이동할 수 있는 지역 ('.')이면 방문체크를 하고 q에 해당 인덱스 값과 time + 1을 append 한다.
6. q가 반복적으로 while문 돌면서 'E' 출구를 만났을 때, return 한다.
7. 만약 q가 빌때까지 출구를 찾지 못했으면, "Trapped" 를 return 한다.
2. 정답코드
import sys
from collections import deque
input = sys.stdin.readline
while True:
L, R, C = map(int, input().split())
if L == 0 and R == 0 and C == 0:
break
maps = []
for i in range(L):
maps.append([list(map(str, input().strip())) for _ in range(R)])
input()
chk = [[[False] * C for _ in range(R)] for _ in range(L)]
dy, dx, dz = (1, -1, 0, 0, 0, 0), (0, 0, 1, -1, 0, 0), (0, 0, 0, 0, 1, -1)
def bfs(y, x, z):
q = deque()
q.append((y, x, z, 0))
while q:
ey, ex, ez, time = q.popleft()
for d in range(6):
ny, nx, nz = ey + dy[d], ex + dx[d], ez + dz[d]
if 0 <= ny < R and 0 <= nx < C and 0 <= nz < L:
if maps[nz][ny][nx] == '.' and chk[nz][ny][nx] == False:
chk[nz][ny][nx] = True
q.append((ny, nx, nz, time + 1))
elif maps[nz][ny][nx] == 'E' and chk[nz][ny][nx] == False:
return f'Escaped in {time + 1} minute(s).'
else:
return "Trapped!"
for i in range(L):
for j in range(R):
for k in range(C):
if maps[i][j][k] == 'S':
chk[i][j][k] = True
print(bfs(j, k, i))
break
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 2146. 다리만들기 Python (0) | 2023.01.30 |
---|---|
[BOJ] 13549. 숨바꼭질 3 Python (0) | 2023.01.29 |
[BOJ] 10026. 적록색약 Python, Java (1) | 2023.01.28 |
[BOJ] 2573. 빙산 (0) | 2023.01.23 |
[BOJ] 9205. 맥주 마시면서 걸어가기 (0) | 2023.01.22 |