BFS 또는 DFS를 활용하는 문제입니다. DFS로 풀었지만 백준 내 재귀 함수의 깊이가 1000으로 고정되어있어 DFS로 푸시려면 sys.setrecursionlimit(100000)를 작성하여 깊이 제한을 풀어야합니다.
BFS로 푸는 방법은 다음과 같습니다.
저는 여기서 안전영역을 구할 때 물의 높이에 따라 체크 리스트를 계속 초기화 했지만, 그럴 필요 없이 방문 체크 리스트 처럼 처음에 선언해놓고 써도 될 것 같습니다.
import sys
import copy
sys.setrecursionlimit(100000)
input = sys.stdin.readline
n = int(input())
high = -1  # 최대 높이
answer = 1
graph = []
arr = [[False] * n for _ in range(n)]
for _ in range(n):
    graph.append(list(map(int, input().rstrip().split())))
for i in range(n):
    for j in range(n):
        high = max(high, graph[i][j])
def dfs(height, visited, x, y):
    global n
    dx = -1, 0, 1, 0
    dy = 0, 1, 0, -1
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if (
            0 <= nx < n
            and 0 <= ny < n
            and not visited[nx][ny]
            and graph[nx][ny] > height
        ):
            visited[nx][ny] = True
            dfs(height, visited, nx, ny)
for height in range(1, high):
    visited = copy.deepcopy(arr)
    cnt = 0
    for i in range(n):
        for j in range(n):
            if graph[i][j] > height and not visited[i][j]:
                cnt += 1
                # dfs로 물에 잠기지 않은 영역 구하기
                dfs(height, visited, i, j)
    answer = max(cnt, answer)
print(answer)
import sys
from collections import deque
input = sys.stdin.readline
n = int(input())
board = [list(map(int, input().split())) for _ in range(n)]
visited = [[False] * n for _ in range(n)]
max_value = 0
answer = 1
for i in range(n):
    for j in range(n):
        max_value = max(max_value, board[i][j])
# 해당 높이 이하는 반드시 체크
# command 0 = 물에 잠기는 영역 체크 1 = 안전영역 체크
def bfs(x, y, height, safezone, command):
    dx = -1, 0, 1, 0
    dy = 0, 1, 0, -1
    q = deque()
    q.append((x, y))
    while q:
        x, y = q.popleft()
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < n:
                if command == 0 and not visited[nx][ny] and board[nx][ny] <= height:
                    visited[nx][ny] = True
                    q.append((nx, ny))
                if command == 1 and not safezone[nx][ny] and board[nx][ny] > height:
                    safezone[nx][ny] = True
                    q.append((nx, ny))
for day in range(1, max_value):
    safezone = [[False] * n for _ in range(n)]
    for i in range(n):
        for j in range(n):
            # 물에 잠기는지 체크
            if not visited[i][j] and board[i][j] <= day:
                visited[i][j] = True
                bfs(i, j, day, safezone, 0)
    cnt = 0
    for i in range(n):
        for j in range(n):
            # 안전영역이 몇개인지 체크
            if not safezone[i][j] and board[i][j] > day:
                safezone[i][j] = True
                bfs(i, j, day, safezone, 1)
                cnt += 1
    answer = max(answer, cnt)
print(answer)