cmod.ify
[7569] 토마토 - 6방향 탐색 본문
728x90
반응형
4방향 탐색 토마토는 풀어봤는데 6방향은 처음 풀었다.
3차원 리스트도 처음 만들어봐서 머릿속으로 도저히 그려지지 않아 그림판까지 사용했다 ㅋㅋ

dx, dy말고 dz까지 추가됐다.
초안
import sys
from collections import deque
input = sys.stdin.readline
M, N, H = map(int, input().split())
tom = []
# 입력 받을 때 0 개수 세기.
zerocnt = 0
for i in range(H):
tmp = []
for j in range(N):
li = list(map(int, input().strip().split()))
if 0 in li:
zerocnt = 1
tmp.append(li)
tom.append(tmp)
dz = [-1, 1, 0, 0, 0, 0]
dx = [0, 0, -1, 1, 0, 0]
dy = [0, 0, 0, 0, -1, 1]
def bfs(h, n, m):
q = deque([(h, n, m)])
while q:
cz, cx, cy = q.popleft()
# 6방향 탐색
for ne in range(6):
nz = cz + dz[ne]
nx = cx + dx[ne]
ny = cy + dy[ne]
# 범위 안이고 방문 가능한가?
if 0 <= nz < H and 0 <= nx < N and 0 <= ny < M and tom[nz][nx][ny] == 0:
q.append((nz, nx, ny))
tom[nz][nx][ny] = tom[cz][cx][cy] + 1
# 3차원 반복하며 1인경우 탐색 시작
for i in range(H):
for j in range(N):
for k in range(M):
if tom[i][j][k] == 1:
bfs(i, j, k)
# 입력시 0 없으면 0 출력하고 종료
if zerocnt == 0:
print(0)
# 3차원 반복(출력용)
else:
zerocnt = 0
answer = 0
for i in range(H):
for j in range(N):
for k in range(M):
# 0이 있는 경우 -1 출력하고 종료
if tom[i][j][k] == 0:
zerocnt = 1
break
# 모든 칸 개수 최댓값 저장하기
answer = max(answer, tom[i][j][k])
if zerocnt:
break
if zerocnt:
break
if zerocnt:
print(-1)
else:
if answer == 0 : print(0)
else:
print(answer - 1)
이렇게 풀고 입력값은 제대로 나오는데 자꾸 틀렸습니다. 라고 떠서 제미나이한테 sos
내가 놓친 건 1로 시작한 건 동시에 시작해야 한다는 것이었다.
그 부분을 수정해서 제출해봤더니 성공!
최종본
import sys
from collections import deque
input = sys.stdin.readline
M, N, H = map(int, input().split())
tom = []
list1 = []
# 입력 받을 때 0 개수 세기.
zerocnt = 0
for i in range(H):
tmp = []
for j in range(N):
li = list(map(int, input().strip().split()))
if 0 in li:
zerocnt = 1
tmp.append(li)
tom.append(tmp)
dz = [-1, 1, 0, 0, 0, 0]
dx = [0, 0, -1, 1, 0, 0]
dy = [0, 0, 0, 0, -1, 1]
def bfs(li):
q = deque()
for i in li:
h, n, m = i[0], i[1], i[2]
q.append((h, n, m))
while q:
cz, cx, cy = q.popleft()
# 6방향 탐색
for ne in range(6):
nz = cz + dz[ne]
nx = cx + dx[ne]
ny = cy + dy[ne]
# 범위 안이고 방문 가능한가?
if 0 <= nz < H and 0 <= nx < N and 0 <= ny < M and tom[nz][nx][ny] == 0:
q.append((nz, nx, ny))
tom[nz][nx][ny] = tom[cz][cx][cy] + 1
# 3차원 반복하며 1인경우 탐색 시작
for i in range(H):
for j in range(N):
for k in range(M):
if tom[i][j][k] == 1:
list1.append([i, j, k])
bfs(list1)
# 입력시 0 없으면 0 출력하고 종료
if zerocnt == 0:
print(0)
# 3차원 반복(출력용)
else:
zerocnt = 0
answer = 0
for i in range(H):
for j in range(N):
for k in range(M):
# 0이 있는 경우 -1 출력하고 종료
if tom[i][j][k] == 0:
zerocnt = 1
break
# 모든 칸 개수 최댓값 저장하기
answer = max(answer, tom[i][j][k])
if zerocnt:
break
if zerocnt:
break
if zerocnt:
print(-1)
else:
if answer == 0:
print(0)
else:
print(answer - 1)728x90
반응형
'BASIC > 코딩테스트' 카테고리의 다른 글
| [16928] 뱀과 사다리 게임 (2) | 2026.01.09 |
|---|---|
| [10026] 적록색약 (0) | 2026.01.08 |
| [5430] AC (0) | 2026.01.07 |
| [11403] 경로 찾기 - 플로이드-워셜 (0) | 2026.01.07 |
| [11286] 절댓값 힙 (0) | 2026.01.06 |