https://www.acmicpc.net/problem/2468
2468번: 안전 영역
재난방재청에서는 많은 비가 내리는 장마철에 대비해서 다음과 같은 일을 계획하고 있다. 먼저 어떤 지역의 높이 정보를 파악한다. 그 다음에 그 지역에 많은 비가 내렸을 때 물에 잠기지 않는
www.acmicpc.net
import copy
def dfs(sti,stj):
global cnt, max_cnt
q=[(sti,stj)]
arr[sti][stj] = 0
while q:
i,j = q.pop(0)
for ti,tj in [(1,0),(-1,0),(0,1),(0,-1)]:
ni, nj = i+ti, j+tj
if 0<=ni<n and 0<=nj<n and arr[ni][nj]>rain: # 유효한 인덱스에 잠기지 않은 구역이라면
q.append((ni,nj))
arr[ni][nj] = 0
cnt += 1
if max_cnt <= cnt:
max_cnt = cnt
n = int(input())
arr = [list(map(int,input().split())) for _ in range(n)]
copy_arr = copy.deepcopy(arr) # 비 양이 늘어날 때마다 arr을 원상복구 해주기위해
cnt, max_cnt = 0,0 # 구역 개수/최대구역개수
rain = 0 # 비의 양
while True:
flag = 0
for i in range(n):
for j in range(n):
if arr[i][j] > rain: # arr에서 잠기지 않은 곳 기준으로 dfs돌리기
flag = 1
dfs(i,j)
if flag == 1: # dfs를 돌릴게 있었으면(안전구역이 하나라도 있으면)
rain += 1 # 비 양을 늘려 다시 while문을 돌린다
cnt = 0 # cnt도 초기화 시켜줌
arr = copy.deepcopy(copy_arr) # arr도 원상복구 시켜줌
else: # 모두 잠긴다면?
break # 비 양을 늘려볼 필요 없이 끝내기
print(max_cnt)
단지번호 문제와 유사하게 visited을 따로 만들지 않고 풀기!
'백준' 카테고리의 다른 글
백준 9205. 맥주 마시면서 걸어가기 (0) | 2023.09.21 |
---|---|
백준 2573. 빙산 (0) | 2023.09.20 |
백준 1182. 부분수열의 합 (0) | 2023.09.18 |
백준 15649. N과 M (1) (0) | 2023.09.15 |
백준 9663. N-Queen (0) | 2023.09.15 |