코딩하는 해맑은 거북이

[Python] 치즈 - 백준 (BFS) 본문

코딩테스트

[Python] 치즈 - 백준 (BFS)

#CJE 2023. 9. 4.
해당 글은 백준 2638번 '치즈' 문제를 다룬다.

문제

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

 

2638번: 치즈

첫째 줄에는 모눈종이의 크기를 나타내는 두 개의 정수 N, M (5 ≤ N, M ≤ 100)이 주어진다. 그 다음 N개의 줄에는 모눈종이 위의 격자에 치즈가 있는 부분은 1로 표시되고, 치즈가 없는 부분은 0으로

www.acmicpc.net

 

설명

해당 문제는 치즈의 외부 공간과 내부 공간을 파악하는게 핵심인 문제이다.

모눈종이의 맨 가장자리에는 치즈가 놓이지 않는 것으로 가정한다는 말을 통해서 (0, 0)부터 탐색하여 외부 공간과 내부 공간을 파악할 수 있다.

본 글에서는 BFS로 해결하였고, 외부 공간을 탐색할 때 치즈가 존재하는 곳이라면 +1을 해준다.(공기가 접촉한 부분)

공기가 접촉한 부분이 기존의 1에서 +2(두 부분)인 3 이상이라면, 1시간 후 치즈가 녹아 없어지는 것이다.

 

코드

from collections import deque
n, m = map(int, input().split())
arr = []
for _ in range(n):
    arr.append(list(map(int, input().split())))

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

def bfs():
    visited = [[False]*m for _ in range(n)]
    q = deque([])
    q.append((0, 0))
    visited[0][0] = True
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if nx >= 0 and nx < n and ny >= 0 and ny < m:
                if not visited[nx][ny]:
                    if arr[nx][ny] == 0:
                        visited[nx][ny] = True
                        q.append((nx, ny))
                    else:  # 치즈가 존재한다면 공기접촉횟수 +1
                        arr[nx][ny] += 1

result = 0
while True:
    bfs()
    flag = 0
    for i in range(n):
        for j in range(m):
            if arr[i][j] >= 3:  # 기존 1에 공기접촉구간 +2 = 3
                arr[i][j] = 0
                flag = 1
            elif arr[i][j] > 1: # 다시 bfs를 위해 초기화
                arr[i][j] = 1
    if flag == 1:
        result += 1
    else:
        break
print(result)

     

 

 

Comments