알고리즘/Python

[백준] 2638 - 치즈

9__bin 2023. 9. 1. 19:33

https://www.acmicpc.net/status?user_id=imagen33&problem_id=2638&from_mine=1 

 

채점 현황

 

www.acmicpc.net

문제 한줄 이해

- 격자에 치즈와 공기로 채워져 있을 때 치즈가 2변 이상이 공기와 맞닿아(단 치즈로 둘러쌓인 공기는 영향을 주지 않는다) 있으면 한시간마다 녹아서 없어져 버린다고 한다.

이때 총 몇시간이 지나야 다 녹는지 구하기!

생각난 풀이

1번째 방법: 문제를 읽고 생각난 필요한 조건들

1. 우선 각 치즈에 공기에 맞닿는 부분이 몇변인지 세기

-> 먼저 BFS로 0,0부터 탐색을 시작한다 why? 문제에서 가장자리는 무조건 공기라고 주어졌다. 이때 0,0부터 탐색을 진행해 공기일때만 탐색 대상으로 삼으면 치즈로 둘러쌓인 내부는 탐색 대상에 포함시키지 않을 수 있다. (미로 찾기라 생각하자 벽으로 둘러쌓인 지역은 못가지 않는가!) 

2. 치즈를 어떻게 녹여야 하는지 -> 먼저 각 치즈들의 변의 갯수를 담을 배열을 선언해주고 탐색이 끝난 다음 2변 이상 맞닿아 있는 곳을 녹여준다.

 

import sys
from collections import deque
n,m = map(int,sys.stdin.readline().split())
graph =[]
dx = [0,0,1,-1]
dy = [1,-1,0,0]
for i in range(n):
    graph.append(list(map(int,sys.stdin.readline().split())))
ans = 0

def dfs(x,y):
    que = deque()
    que.append((x,y))
    #방문처리
    cntvisited = [[0 for i in range(m)] for i in range(n)] 
    #각 치즈들의 몇변이 공기와 맞닿아있는지 
    visited = [[False for i in range(m)] for i in range(n)]
    while que:
        nowx,nowy = que.popleft()
        
        for i in range(4):
            nextx = nowx + dx[i]
            nexty = nowy + dy[i]
            
            if nextx >= 0 and nexty >=0 and nextx < n and nexty<m:
                if graph[nextx][nexty] == 0 and visited[nextx][nexty] == False:
                    visited[nextx][nexty] = True
                    que.append((nextx,nexty))
                # 공기와 맞닿을 경우 +1
                elif graph[nextx][nexty] == 1 and visited[nextx][nexty] == False:
                    cntvisited[nextx][nexty] += 1
    #맞닿은 변이 2개이상일 경우 녹여야 하기때문에 좌표 담아서 녹이기
    fire =[]
    for i in range(n):
        for j in range(m):
            if cntvisited[i][j] >=2:
                fire.append((i,j))
                
    for a,b in fire:
        graph[a][b] = 0
        
while True:
    cnt = 0

    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1:
                cnt +=1
    if cnt == 0:
        break
    ans +=1
    dfs(0,0)
print(ans)

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

[백준] 16236 - 아기상어  (0) 2023.09.03
[백준] 11779 - 최소비용 구하기 2  (0) 2023.09.02
[백준] 1238 - 파티  (0) 2023.08.28
[백준] 17144 - 미세먼지 안녕!  (0) 2023.08.25
[백준] 14938 - 서강그라운드  (0) 2023.08.24