치즈 [백준 2638] (파이썬)

오준혁·2023년 6월 16일
0

알고리즘

목록 보기
12/29

문제


치즈 [백준 2638]
https://www.acmicpc.net/problem/2638

풀이


외부 공기에 닿은 치즈는 1시간 뒤에 녹는다. 이때 치즈가 전부 녹는 시간을 구하여라

  • 치즈로 둘려쌓여있는 공간은 외부로 치지 않음
  • bfs 사용해야함

처음에는 내부에 있는 공간의 좌표를 모두 조사해서 공기라도 내부에 있으면 외부로 생각 안하게끔 하려고 했는데 쉽지 않았다. 근데 생각해보니 bfs 를 사용하여 공기인 곳을 찾아 0, 0 에서부터 조사하면 내부로 갈 일이 없어보였다. 해서 닿은 면적이 2면 이상이면 녹이는 코드를 작성할 수 있었다.

코드

from collections import deque
n, m = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]
def melt():
    q = deque()
    q.append((0, 0))
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny]:
                if board[nx][ny] >= 1:
                    board[nx][ny] += 1
                else:
                    visited[nx][ny] = True
                    q.append((nx, ny))
cnt_cheeze = 0

for i in range(n):
    for j in range(m):
        if board[i][j] == 1:
            cnt_cheeze += 1  
time = 0                   
  
while True:
    if cnt_cheeze == 0:
        break
    visited = [[False] * m for _ in range(n)]
    melt()
    cnt = 0
    for i in range(n):
        for j in range(m):
            if board[i][j] >= 3:
                board[i][j] = 0
                cnt += 1
            elif 1 <= board[i][j] < 3:
                board[i][j] = 1
    cnt_cheeze -= cnt
    time += 1
print(time)
       

0개의 댓글