Algorithm

[코드트리 조별과제] DFS - 안전지대

Daejlee 2024. 8. 18. 22:56
import sys

sys.setrecursionlimit(2500)  # 재귀 깊이 설정
n, m = map(int, input().split())
highest = 0
mat = []
ans = [1, 0]
visited = []
for _ in range(n):
    buf = [int(x) for x in input().split()]
    highest = max(highest, max(buf))
    mat.append(buf)


def search(row, col, k):
    global visited

    if (
        row < 0
        or col < 0
        or row > n - 1
        or col > m - 1
        or visited[row][col] == True
        or mat[row][col] <= k
    ):
        return
    visited[row][col] = True
    search(row - 1, col, k)
    search(row + 1, col, k)
    search(row, col + 1, k)
    search(row, col - 1, k)


# K를 늘려가며 안전지대를 탐색한다.
def DFS():
    global highest, ans, visited

    for k in range(1, highest):
        visited = [[False for _ in range(m)] for _ in range(n)]
        comfort_zone = 0
        for row in range(n):
            for col in range(m):
                # 이미 방문했거나 물에 잠긴 좌표는 넘어간다.
                if visited[row][col] == True or mat[row][col] <= k:
                    continue
                comfort_zone += 1
                search(row, col, k)
        if comfort_zone > ans[1]:
            ans = [k, comfort_zone]


DFS()
for item in ans:
    print(item, end=" ")

DFS 챕터를 진행했습니다. 챕터 볼륨이 적고 난이도가 적어 아주 중요하게 다뤄지는 내용은 아닌걸로 보입니다. (BFS와 비교해서..)

DFS에서 반복되었던 패턴은 방문 체크를 위한 문제와 같은 크기의 배열의 존재 + dx, dy 좌표 이동이었습니다.

평이한 챕터였기에 재귀 깊이 설정을 처음 해봤던 문제를 기록한다. 흠.. 앞으로 재귀 문제는 따로 깊이 설정을 해야하나 싶다.