풀이
시간이 지날 때 마다 빙산이 녹고 빙산이 2 조각 이상 분리될 경우 몇 년이 걸리는지 계산하는 문제이다.
1년이 지날 때 마다 빙산이 녹는 기능은 “미세먼지 안녕!” 문제.
빙산의 조각을 세는 기능은 “단지번호붙이기” 문제.
“단지번호붙이기” 문제와 “미세먼지 안녕!” 문제를 합쳐놓은 문제같다.
while문을 활용해 모든 빙산이 녹거나 빙산이 2 조각 이상으로 분리될 때 까지 위 기능을 반복시킨다.
visited 와 new 2 차원 배열을 초기화 해주면서 1년 후 빙산이 녹았을 때 정보를 new 에 저장해주고,
이 new 를 bfs 에 집어넣어 visited 를 통해 방문처리를 해준다.
bfs 가 한 번 실행될 때 마다 빙산 한 조각이 있다는 얘기기 때문에 이에 맞춰서 piece 변수를 수정해주고,
2 조각 이상일 경우 종료, 아닐 경우 반복하면된다.
소스코드
# 빙산
from collections import deque
import sys
input = sys.stdin.readline
def bfs(i, j):
q = deque()
q.append([i, j])
visited[i][j] = 1
while q:
x, y = q.popleft()
for k in range(4):
nx = x + dx[k]
ny = y + dy[k]
if 0 <= nx < n and 0 <= ny < m: # 범위 내일 때
if new[nx][ny] != 0 and visited[nx][ny] == 0: # 빙산이 이어져 있으며 방문하지 않았을 경우
q.append([nx, ny])
visited[nx][ny] = 1 # 방문 처리
return
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
n, m = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
years = 1
while True:
# 빙산이 다 녹을 때 까지 분리되지 않을 경우
zero = 0
for g in graph:
zero += sum(g)
if zero == 0:
print(0)
break
# 초기화
visited = [[0] * m for _ in range(n)]
new = [[0] * m for _ in range(n)]
piece = 0
# 지구 온난화
for i in range(n):
for j in range(m):
if graph[i][j] != 0:
temp = graph[i][j]
for k in range(4):
nx = i + dx[k]
ny = j + dy[k]
if 0 <= nx < n and 0 <= ny < m and graph[nx][ny] == 0:
temp -= 1
if temp > 0:
new[i][j] = temp
# 빙산이 몇 조각인지 확인
for i in range(n):
for j in range(m):
if new[i][j] != 0 and visited[i][j] == 0:
bfs(i, j)
piece += 1
# 빙산이 분리될 경우
if piece > 1:
print(years)
break
# 1년 후 빙산정보 업데이트
years += 1
graph = new