상세 컨텐츠

본문 제목

[ 백준 / 파이썬 ] 7569.토마토

알고리즘/BOJ

by 감싹이 2023. 4. 2. 14:35

본문

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

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

🎉🎉 문제

창고에 보관되는 토마토들 중에는 잘 익은 것도 있지만, 아직 익지 않은 토마토들도 있을 수 있다. 보관 후 하루가 지나면, 익은 토마토들의 인접한 곳에 있는 익지 않은 토마토들은 익은 토마토의 영향을 받아 익게 된다. 하나의 토마토에 인접한 곳은 위, 아래, 왼쪽, 오른쪽, 앞, 뒤 여섯 방향에 있는 토마토를 의미한다. 대각선 방향에 있는 토마토들에게는 영향을 주지 못하며, 토마토가 혼자 저절로 익는 경우는 없다고 가정한다. 철수는 창고에 보관된 토마토들이 며칠이 지나면 다 익게 되는지 그 최소 일수를 알고 싶어 한다.

토마토를 창고에 보관하는 격자모양의 상자들의 크기와 익은 토마토들과 익지 않은 토마토들의 정보가 주어졌을 때, 며칠이 지나면 토마토들이 모두 익는지, 그 최소 일수를 구하는 프로그램을 작성하라. 단, 상자의 일부 칸에는 토마토가 들어있지 않을 수도 있다.

 

🎉🎉 풀이

✅ 2차원 배열로 풀려고 해봤자 절대 안된다 .. 질문하기 게시판 가면 첫페이지에 바로 ..

 3차원 배열로 풀어야 하는 게 포인트인 문제

✅ 토마토가 있는 층(높이), 위치좌표 x, y를 다 queue에 담아서 돌림

 방향 검사하는 델타 배열도 윗층 아래층 검사하는 dx, 앞 뒤 검사하는 dy, 왼쪽 오른쪽 검사하는 dz로 나누어 만들어준다

 3차원 그래프의 익은 토마토가 있는 곳(1)에서 윗층, 아래층, 앞, 뒤, 오른쪽, 왼쪽을 검사해서 익지 않은 토마토가 있으면(0) 익혀주는데 기록은 며칠째에 익은 건지로 한다

 3차원 그래프를 검사하는데 0이 하나라도 나오면 -1을 출력하고 끝낸다

exit(0)과 exit(1)의 차이
exit(0) : 성공적으로 프로그램 종료 (EXIT_SUCCESS)
exit(1) : 성공적으로 프로그램 종료X (EXIT_FAILURE)

✅ 층을 돌면서 익은 토마토의 날짜 중 제일 나중 날짜(max)를 갱신해서 기록해둔다

 익힌 날짜를 계산할 때 1일이 추가된 값이 나오므로 -1을 해서 답을 출력해준다

 

🎉🎉 코드

import sys
from collections import deque
m, n, h = map(int, input().split())
graph = []
queue = deque()

for i in range(h):
  tmp = []
  for j in range(n):
    tmp.append(list(map(int, sys.stdin.readline().split())))
    for k in range(m):
      if tmp[j][k] == 1:
        queue.append([i, j, k])
  graph.append(tmp)

dx = [-1, 1, 0, 0, 0, 0]
dy = [0, 0, 1, -1, 0, 0]
dz = [0, 0, 0, 0, 1, -1]

while queue:
  x, y, z = queue.popleft()
  
  for i in range(6):
    a = x+dx[i]
    b = y+dy[i]
    c = z+dz[i]
    
    if 0<=a<h and 0<=b<n and 0<=c<m:
      if graph[a][b][c] == 0:
        queue.append([a, b, c])
        graph[a][b][c] = graph[x][y][z]+1

day = 0
for i in graph:
  for j in i:
    for k in j:
      if k == 0:
        print(-1)
        exit(0)
    day = max(day, max(j))

print(day-1)

 

나의 눈물나는 2차원 배열 코드 ...

더보기

흑흑

from collections import deque

def findZero(box):
  zero = 0
  for i in range(n*h):
    for j in range(m):
      if box[i][j] == 0:
        zero+=1

  if zero == 0:
    return True
  else:
    return False

m, n, h = map(int, input().split())

box = [list(map(int, input().split())) for _ in range(n*h)]

queue = deque()

for i in range(n*h):
  for j in range(m):
    if box[i][j] == 1:
      queue.append([i, j, 0])

visited = [[False]*m for _ in range(n*h)]

answer = 0

di = [-1, 0, 1, 0]
dj = [0, 1, 0, -1]

for i in range(1, h):
  di.append((-n)*i)
  dj.append(0)
  di.append(n*i)
  dj.append(0)

answer = 0
while queue:
  i, j, day = queue.popleft()

  for k in range(len(di)):
    ni = i+di[k]
    nj = j+dj[k]

    if 0<=ni<n*h and 0<= nj < m:
      if box[ni][nj] == 0:
        box[ni][nj] = 1
        queue.append([ni, nj, day+1])

  answer = day

  
if not findZero(box):
  print(-1)
else:
  print(answer)

 

참고 블로그

https://jiwon-coding.tistory.com/98

관련글 더보기