728x90
반응형
import copy
import sys
sys.setrecursionlimit(10000000)
n = int(input())
graph = []
max_h = 0
for i in range(n):
graph.append(list(map(int,sys.stdin.readline().split())))
max_h = max( max_h, max(graph[i]))
save = [0] * ( max_h +1 )
save[0] = 1 # 비가 안오면 전 영역( 1개 ) 이 안전하다.
def dfs ( x,y,h, tmp_graph):
move_x = [-1,1,0,0] # 가로
move_y = [0,0,-1,1] # 세로
tmp_graph[x][y] = 0
for i in range(4):
nx = x + move_x[i]
ny = y + move_y[i]
if nx <0 or ny <0 or nx>=n or ny>= n :
continue
if tmp_graph[nx][ny] >= h :
dfs ( nx, ny, h, tmp_graph)
for h in range(1, max_h+1):
tmp = copy.deepcopy(graph)
cnt = 0
for i in range(n):
for j in range(n):
if tmp[i][j] >= h :
dfs(i,j,h,tmp)
cnt += 1
save[h] = cnt
print(max(save))
step 1 ) 그냥 입력 받으면 런타임 에러 나니까 import sys
step 2 ) graph 입력 받기 , 가장 큰 높이 까지만 찾아보면 되니까 가장 큰 높이 구하기
step 3 ) 각 높이 별 안전한 영역 저장할 list 선언 ( save )
단, 높이가 0 일 때는 모두 다 하나의 안전한 구역이므로 1 로 설정.
step 4 ) dfs 구현 하기. 가로 세로로 움직이며 다음과 같은 조건 부여
① 움직인 결과 그래프 안에 있는지 ② 현재 검사하고 있는 높이보다 높으면 dfs 진행
③ 방문 처리를 위해서 dfs 진행한 구역은 값을 0으로 만들어주기
step 5 ) 1 ~ 가장 높은 높이까지 반복. 기존 graph 는 바뀌면 안되니까 깊은 copy 를 통해 각 높이 별로 복사해서 사용
깊은 복사는 copy module 로 구현 가능하며, a = copy.deepcopy( b ) 와 같이 쓴다.
step 6 ) 각 높이 별 안전한 구역의 개수 세어서 저장, 가장 큰 값 출력하기
728x90
반응형
'백준 > DFS_BFS' 카테고리의 다른 글
# 2644 촌수계산 (0) | 2021.03.11 |
---|---|
# 2583번: 영역 구하기 (0) | 2020.10.12 |
# 4963번: 섬의 개수 (0) | 2020.10.12 |
# 11724번: 연결 요소의 개수 (0) | 2020.10.12 |
# 1260번: DFS와 BFS (0) | 2020.10.11 |