Hanbit the Developer
[그래프] Python - 2468번, 안전 영역 본문
import sys
sys.setrecursionlimit(20000)
input = sys.stdin.readline
N = int(input())
Map = []
for _ in range(N):
Map.append(list(map(int, input().split())))
stateMap = None
def getSafeZone(h):
global stateMap
stateMap = [[0]*N for _ in range(N)]
cntSafeZone = 0
for i in range(N):
for j in range(N):
if Map[i][j] > h and stateMap[i][j] == 0:
cntSafeZone += 1
dfs(i, j, h)
return cntSafeZone
def dfs(x, y, h):
global stateMap
stateMap[x][y] = 1
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
for i in range(4):
curX, curY = x+dx[i], y+dy[i]
if(0 <= curX <= N-1 and 0 <= curY <= N-1):
if stateMap[curX][curY] == 0:
if Map[curX][curY] > h:
dfs(curX, curY, h)
maxSafeZone = 0
for i in range(0, 101):
cur = getSafeZone(i)
if cur == 0:
break
maxSafeZone = max(maxSafeZone, cur)
print(maxSafeZone)
getSafeZone()는 비가 h만큼 올 때 안전한 영역을 구하는 함수입니다. 우선 stateMap[][]에는 각 위치가 잠겼는지(0) 안전한지(1)를 저장하는 변수이며 디폴트값은 0입니다. 전체 영역을 쭉 돌면서, h보다 높으면서 stateMap이 0(디폴트, 아직 고려하지 않은 위치를 의미함)일 때, 함수에서 반환할 cntSafeZone을 1 증가시키고 dfs를 돌립니다.
dfs는 인접한 안전한 지역을 모두 돌면서 stateMap을 갱신시켜줍니다. 따라서, 하나의 안전 영역 전체를 1로 바꿔주기 때문에, getSafeZone에서 dfs로 다신 접근할 일이 없습니다.
마지막으로, 0 until 100으로 getSafeZone()을 돌려서 최댓값을 저장하고 출력을 합니다. 다만, getSafeZone()으로 얻은 값이 0일 경우(모두 잠길 경우), i를 아무리 더 올려도 모두 0이므로 그곳에서 break를 합니다.
'Algorithm > 백준' 카테고리의 다른 글
[그리디] Python - 11047번, 동전 0 (0) | 2021.03.15 |
---|---|
[문자열] Python - 1427번, 소트인사이드 (0) | 2021.03.11 |
[DP] Python - 1516번, 게임 개발 (0) | 2021.03.11 |
[그리드] Python - 11000번, 강의실 배정 (0) | 2021.03.10 |
[문자열] Python - 4949번, 균형잡힌 세상 (0) | 2021.03.10 |