이번 문제는 깊이우선탐색을 통해 해결하였다. 처음에는 공간 복잡도를 최대한 줄이기 위해서 방문처리 리스트를 사용하지 않고 구현해보려고 했다. 이 방법을 위해 매 반복마다 높이의 최솟값을 구한 뒤에 dfs함수에서 거쳐가는 위치의 높이에서 최솟값을 빼주는 방식으로 해보기로 했지만 이 방법은 재귀 호출의 조건에 걸려 방문하지 않은 구역의 높이는 그대로 유지되기 때문에 맞지 않는 접근이었다.
그래서 결국은 방문처리 리스트를 사용하기로 하였다. 우선 최소한으로 반복하기 위해서 높이의 최솟값과 최댓값을 구한 뒤에 물에 잠기는 기준을 최솟값-1부터 최댓값까지 1씩 늘려가며 그때 그때의 가라앉지 않은 영역의 갯수를 리스트에 저장하고 최종적으로 리스트에서 가장 큰 값을 출력하도록 작성하였다. 기준의 범위를 최솟값-최댓값으로 지정했을 때는 만약 모든 높이가 같을 경우에 무조건 영역의 최대 갯수가 0이 되기 때문에 모든 땅이 가라앉지 않은 경우를 추가하기 위해 (최솟값-1)-최댓값으로 지정하였다.
dfs()함수의 경우에는 4가지 방향으로 나아가며 방문 전이고 기준 높이보다 높을 경우에만 재귀호출 하는 방식으로 작성하였다.
visited[y][x]
를 True로 갱신하여 방문처리해준다.y+dy[i]
로 저장한다.x+dx[i]
로 저장한다.area[ny][nx]
가 depth보다 크고, visited[ny][nx]
가 False일 경우, dfs(ny, nx, depth)
를 재귀호출한다.area[i]
의 최솟값과 mn 중 더 작은 값으로 갱신한다.area[i]
의 최댓값과 mx 중 더 큰 값으로 갱신한다.area[j][k]
가 mn보다 크고, visited[ny][nx]
가 False일 경우,dfs(i, j, i)
를 호출한다.import sys
sys.setrecursionlimit(10**9)
def dfs(y, x, depth):
visited[y][x]=True
dy=[0, 0, -1, 1]
dx=[1, -1, 0, 0]
for i in range(4):
ny=y+dy[i]
nx=x+dx[i]
if ny>=0 and nx>=0 and ny<n and nx<n and area[ny][nx]>depth and visited[ny][nx]==False:
dfs(ny, nx, depth)
n=int(input())
area=[]
mn=sys.maxsize
mx=0
for i in range(n):
area.append(list(map(int, input().split())))
mn=min(min(area[i]), mn)
mx=max(max(area[i]), mx)
results=[]
for i in range(mn-1, mx+1):
visited=[[False]*n for _ in range(n)]
cnt=0
for j in range(n):
for k in range(n):
if area[j][k]>i and visited[j][k]==False:
dfs(j, k, i)
cnt+=1
results.append(cnt)
print(max(results))