728x90
반응형
https://www.acmicpc.net/problem/2573
2573번: 빙산
첫 줄에는 이차원 배열의 행의 개수와 열의 개수를 나타내는 두 정수 N과 M이 한 개의 빈칸을 사이에 두고 주어진다. N과 M은 3 이상 300 이하이다. 그 다음 N개의 줄에는 각 줄마다 배열의 각 행을
www.acmicpc.net
문제 해결
- 빙산의 녹는 것을 계산한 다음 바다로 인해 하나였던 빙산이 두 개 이상으로 분리되는데 걸린 시간을 구하는 문제
- bfs를 통해 빙산의 개수를 구할 수 있다.
CODE
import sys
input = sys.stdin.readline
from collections import deque
def bfs(x,y):
que = deque()
que.append((x,y))
visited[x][y] = 1
sealist = []
while que:
a, b = que.popleft()
sea = 0
for i in range(4):
new_a = a + dx[i]
new_b = b + dy[i]
if 0<=new_a<n and 0<=new_b<m:
if not graph[new_a][new_b]:
sea += 1
elif graph[new_a][new_b] and not visited[new_a][new_b]:
que.append((new_a, new_b))
visited[new_a][new_b] = 1
if sea>0:
sealist.append((a,b,sea))
for r, c, sea in sealist:
graph[r][c] = max(0, graph[r][c]-sea)
return 1
n, m = map(int, input().split())
graph = [list(map(int,input().split())) for _ in range(n)]
ice = []
for i in range(n):
for j in range(m):
if graph[i][j]>0:
ice.append((i,j))
dx = [-1,1,0,0]
dy = [0,0,-1,1]
year = 0
while ice:
visited = [[0]*m for _ in range(n)]
delList = [] # 없어진 빙하지역
group = 0
for i, j in ice:
if graph[i][j] and not visited[i][j]:
group += bfs(i,j)
if graph[i][j]==0:
delList.append((i,j))
if group>1:
print(year)
break
ice = sorted(list((set(ice)-set(delList))))
year += 1
if group <2:
print(0)
728x90
반응형
'알고리즘 > [python] 백준 BOJ' 카테고리의 다른 글
[python] 백준 2661 좋은수열 (0) | 2023.03.27 |
---|---|
[python] 백준 9205 맥주 마시면서 걸어가기 (0) | 2023.03.26 |
[python] 백준 9084 동전 (0) | 2023.03.22 |
[python] 백준 1092 배 (0) | 2023.03.21 |
[python] 백준 1495 기타리스트 (0) | 2023.03.20 |
댓글