티스토리 뷰

본 글의 내용은 절대적으로 좋은 코드라는 보장이 없습니다. 글을 읽어보시다가 "이 사람은 이런 식으로 짰구나. 되게 허접하게 짰네?" 라는 생각이 드시면 댓글을 통해서 좋은 가르침과 의견을 주시면 감사합니다!!


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

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 

기본 아이디어

  • 날이 지날 때마다 익은 토마토에서 안 익은 토마토로 번져나가는 구도가 BFS에 가깝다고 생각하여 BFS로 구현하였다.
  • 큐(Queue)에는 익은 토마토의 x좌표, y좌표와 익은 날에 대한 정보를 담아주었다.
  • 익은 날이 갱신될 때마다 기록해주었다.
  • 처음 익지 않은 토마토의 개수를 기록해 놓고 익을 때마다 익지 않은 토마토의 개수를 1씩 감소시켜준다.
  • 익는 과정이 끝났는데도 익지 않은 토마토의 개수가 0이 아니라면 -1을 출력한다.
import sys
sys.stdin = open('input.txt', 'r')
from collections import deque

M, N = map(int, input().split())
box = []
for n in range(N):
    box.append(list(map(int, input().split())))

Q = deque([])

zeroCount = 0

for n in range(N):
    for m in range(M):
        if box[n][m] == 1:
            Q.append([m, n, 0])
        elif box[n][m] == 0:
            zeroCount += 1

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

min_day = 0

while Q:
    v = Q.popleft()

    for d in range(4):
        new_x = v[0] + dx[d]
        new_y = v[1] + dy[d]
        if -1 < new_x < M and -1 < new_y < N and not box[new_y][new_x]:
            box[new_y][new_x] = 1
            new_day = v[2] + 1
            zeroCount -= 1
            Q.append([new_x, new_y, new_day])
            if new_day > min_day:
                min_day = new_day

if zeroCount == 0:
    print(min_day)
else:
    print(-1)

 

유의사항

  • 일반적인 리스트로 큐를 구현할 경우 시간 초과가 나와 동작하지 않았다. 따라서 sys의 collections에서 deque를 가져와 deque를 통해 BFS를 수행하였다.

 

반응형

'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글

[python] boj 10422 괄호  (0) 2021.04.18
[python] boj 17103 골드바흐 파티션  (0) 2021.04.18
7569번: 토마토  (0) 2020.10.23
1012번: 유기농 배추 (python)  (0) 2020.10.22
boj_11724_연결 요소의 개수  (0) 2020.10.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함