본문 바로가기
알고리즘

백준_7576_토마토

by 매화of사군자 2020. 1. 15.

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

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토들의 정보가 주어진다. 즉, 둘째 줄부터 N개의 줄에는 상자에 담긴 토마토의 정보가 주어진다. 하나의 줄에는 상자 가로줄에 들어있는 토마토의 상태가 M개의 정수로 주어진다. 정수 1은 익은 토마토, 정수 0은 익지 않은 토마토, 정수 -1은 토마

www.acmicpc.net

해결 방법

> 토마토 상자가 주어지면 이튿날에 익은 토마토의 상하좌우의 토마토들이 익게 되고 다음날 또한 익은 토마토들의 상하좌우의 토마토가 익게 된다.

> BFS를 이용하여 익은 토마토는 queue에 넣고 상하좌우의 토마토를 체크한다.(이미 익은 토마토이면 넘어가고 익지 않은 토마토이면 토마토를 익힌 후 queue에 넣는다.)

> python collections 모듈 deque를 이용한다.

 

코드

더보기

import collections

 

x, y = map(intinput().split())

 

tomato = [] #토마토 판

queue = collections.deque([]) #익은 토마토 선별 후 queue에 삽입

 

unriped = 0 #익지 않은 토마토의 개수

 

#input

for j in range(y):

    tomato.append(list(map(int,input().split())))

    for i in range(x):

        if tomato[j][i] == 1:   #queue input

            queue.append((i,j))

        elif tomato[j][i] == 0:

            unriped += 1

 

day = 0

 

while queue:

 

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

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

 

    t = queue.popleft()

 

    _x = t[0]

    _y = t[1]

 

    #up dowm left right

    for i in range(4):

        nx = _x + dx[i]

        ny = _y + dy[i]

 

        if nx >= x or nx < 0 or ny >= y or ny < 0#index check

            continue

        

        if tomato[ny][nx] != 0:

            continue

 

        tomato[ny][nx] = tomato[_y][_x] + 1

        queue.append((nx,ny))

        day = max(tomato[ny][nx], day)

        unriped -= 1

 

if unriped == 0:

    print(day-1)

else:

    print(-1)

'알고리즘' 카테고리의 다른 글

백준_4963_섬의 개수  (0) 2020.01.20
백준_1389_케빈 베이컨의 6단계 법칙  (0) 2020.01.17
백준_2178_미로 탐색  (0) 2020.01.16
서로소 집합(disjoint set) 연습  (0) 2020.01.14
백준_15649_N과 M(1)  (0) 2020.01.13

댓글