Liam SY Kim
by Liam SY Kim
2 min read

Categories

  • https://www.acmicpc.net/problem/7569

문제 이해 및 적용하기

  • 일반적인 BFS에서는 dx, dy 방향으로 뻗어나간다면, 이문제에는 축 하나가 더 추가되어서 dx, dy, dz로 뻗어나가야 한다.
# dx dy dz
# top bottom left right  zTop zBottom
dx = [ 0, 0, -1, 1, 0, 0]
dy = [ -1, 1, 0, 0, 0, 0]
dz = [ 0, 0, 0, 0, 1, -1]
  • 익지 않은 토마토 : 0, 익은 토마토 : 1, 토마토가 없는 자리 : -1
  • BFS 함수에서 익게 된 토마토는 0 -> 1 로 변경해준다
  • 진행방향에서 값이 0 일때만 deque에 넣어준다.
  • 토마토가 모두 익는데 걸리는 일수를 구하는 것이므로 BFS가 진행될 때에 최대 깊이를 리턴하여 구해주면 된다.
# bfs
def bfs(listforone):
  ans = 0
  d = deque()
  for i in range(len(listforone)):
    d.append([listforone[i][0],listforone[i][1],listforone[i][2],0])
  
  while(d):
    z, y, x, c = d.popleft()
    ans = max([ans, c])
    for i in range(6):
      tx = x + dx[i]
      ty = y + dy[i]
      tz = z + dz[i]
      if tx < 0 or tx > M-1 or ty < 0 or ty > N-1 or tz < 0 or tz > H-1 : 
        continue
      if matrix[tz][ty][tx] != 0:
        continue
      d.append([tz,ty,tx,c+1])
      matrix[tz][ty][tx] = 1
      
    
  return ans

주의할 점

이 문제는 정답율이 37퍼센트 정도이며, BFS로 풀이 가능하다.

Python을 사용하면서 시간초과 이슈로 인해서 주의해야 할 부분이 있었는데, 간과하고 있던 부분이 있어서 틀렸던 문제이다.

BFS를 사용할 때에 list 를 사용하였는데, append()하는데 걸리는 시간이 꾀 느리다는 사실을 알게 되었고 deque를 이용하여 풀어야 Python에서는 정답처리가 된다.

전체 코드

import sys
from collections import deque

# input
input = sys.stdin.readline
M, N, H = map(int,input().split())


# matrix
matrix = []
for i in range(H):
  buf2 = []
  for j in range(N):
    buf = list(map(int,input().split()))
    buf2.append(buf)
  matrix.append(buf2)


# dx dy dz
# top bottom left right  zTop zBottom
dx = [ 0, 0, -1, 1, 0, 0]
dy = [ -1, 1, 0, 0, 0, 0]
dz = [ 0, 0, 0, 0, 1, -1]

# bfs
def bfs(listforone):
  ans = 0
  d = deque()
  for i in range(len(listforone)):
    d.append([listforone[i][0],listforone[i][1],listforone[i][2],0])
  
  while(d):
    z, y, x, c = d.popleft()
    ans = max([ans, c])
    for i in range(6):
      tx = x + dx[i]
      ty = y + dy[i]
      tz = z + dz[i]
      if tx < 0 or tx > M-1 or ty < 0 or ty > N-1 or tz < 0 or tz > H-1 : 
        continue
      if matrix[tz][ty][tx] != 0:
        continue
      d.append([tz,ty,tx,c+1])
      matrix[tz][ty][tx] = 1
      
    
  return ans
  
# Buisness logic

List1 = []

# find 1
for h in range(H):
  for n in range(N):
    for m in range(M):
      if matrix[h][n][m] == 1:
        List1.append([h,n,m])
     
# find bfs depth 


realAns = bfs(List1)
  

# find 0

isZero = False
for h in range(H):
  for n in range(N):
    for m in range(M):
      if matrix[h][n][m] == 0:
        isZero = True
        break

if isZero == True:
  print(-1)
else:
  print(realAns)