본문 바로가기
TIL - 프로그래밍/Python 알고리즘

[백준] 7569. 토마토 - Python

by chaemj97 2022. 6. 15.
728x90

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

 

7569번: 토마토

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

www.acmicpc.net


  • 생각
    • 처음에는 토마토를 한 리스트에 받아와서 위 혹은 아래의 있는 토마토를 행번호에 +N or -N으로 하려 했으나 계속 오류남...
    • 그래서 그냥 상자를 따로 리스트로 받아서 처리
    • exit(0)
      • for문 여러개인 경우 반복을 멈추고 싶을 때마다 함수로 만들어서 return 했는데 위 코드를 쓰면 코드 강제끝이 된다. 다만 밑에 남았을 경우 불가능
  • 코드
from collections import deque
from sys import stdin

# 토마토 위, 아래, 왼쪽, 오른쪽, 앞, 뒤
# 가로 M, 세로 N, 높이 H
M,N,H = map(int,stdin.readline().split())

tomato = [[list(map(int,stdin.readline().rstrip().split())) for _ in range(N)] for __ in range(H)]

# 익은 토마토 위치
ripetomato = deque()
for h in range(H):
    for r in range(N):
        for c in range(M):
            if tomato[h][r][c] == 1:
                ripetomato.append([h,r,c])

# 토마토 익히기
while ripetomato:
    ch,cr,cc = ripetomato.popleft()
    # 우,하,좌,상,위,아래
    for dh,dr,dc in [(0,0,1),(0,1,0),(0,0,-1),(0,-1,0),(1,0,0),(-1,0,0)]:
        nh = ch + dh
        nr = cr + dr
        nc = cc + dc
        # 상자 안에 있고 안 익은 토마토 -> 익히기
        if 0 <= nh < H and 0 <= nr < N and 0 <= nc < M and tomato[nh][nr][nc] == 0:
            tomato[nh][nr][nc] = tomato[ch][cr][cc] + 1
            ripetomato.append([nh,nr,nc])

# 다 익었는가?
day = 0
for h in range(H):
    for r in range(N):
        day = max(day,max(tomato[h][r]))
        # 덜 익은 토마토 1개라도 있다면 실패
        if tomato[h][r].count(0):
            print(-1)
            exit(0)

# 익은 토마토 번호가 1로 시작해서
print(day-1)
728x90
반응형

댓글