백준 문제 링크
안전 영역
- DFS를 사용했다.
- 높이 정보인 lst와, 똑같은 배열의 크기인데 False로 이루어진 dfs_bool을 만들어준다.
- 상,하,좌,우 4방향을 살피면서 좌표(nx,ny)가 높이(h)보다 크고, dfs_bool[nx][ny]가 False인지 구분하는 함수 dfs를 만들어서
위 조건에 부합하면
dfs_bool[nx][ny] = True와 dfs(nx,ny,h)를 각각 실행시킨다.- 높이 k는 lst중 가장 큰 값을 max_num으로 저장해서
range(max_num + 1)동안 돌아준다- k 동안 높이 정보(lst)의 원소를 돌며,
lst[i][j] > k and dfs_bool[i][j] = False이면 count + 1해주고
dfs_bool[i][j] = True와 dfs(i,j,k)를 각각 실행시키고
answer에 count를 담아준다.- max(answer)를 출력하면 끝!
import sys
sys.setrecursionlimit(100000)
N = int(sys.stdin.readline())
lst = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
dx = [0,0,1,-1]
dy = [1,-1,0,0]
def dfs(x,y,h):
for d in range(4):
nx = x + dx[d]
ny = y + dy[d]
if (0<=nx<N) and (0<=ny<N) and (dfs_bool[nx][ny] == False) and lst[nx][ny] > h:
dfs_bool[nx][ny] = True
dfs(nx, ny, h)
answer = []
max_num = 0
for i in lst:
for j in i:
if max_num < j:
max_num = j
for k in range(j+1):
dfs_bool = [[False] * N for _ in range(N)]
count = 0
for i in range(N):
for j in range(N):
if (dfs_bool[i][j] == False) and (lst[i][j] > k):
count += 1
dfs_bool[i][j] = True
dfs(i,j,k)
answer.append(count)
print(max(answer))
어려운 문제였고, 처음에 input()으로 풀었는데 계속 런타임 오류가 나서 찾아보니 sys.setrecursionlimit으로 재귀의 최대 깊이를 설정해줬어야 했다.