Post

백준 2468번 python 풀이 - 안전 영역

문제 링크

2468번

해결책

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import sys

N = int(sys.stdin.readline())

grid = []

isVisited = []
_max = 0
_min = 999

for i in range(N):
    tempList = list(map(int, input().split()))
    grid.append(tempList)
    _tempList = tempList.copy()
    if _tempList[N - 1] > _max: _max = _tempList[N - 1]
    if _tempList[0] < _min : _min = _tempList[0]


dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]

ans = 0

recurcheck = 0

def dfs(x, y, h):
    global recurcheck
    recurcheck += 1

    for way in range(4):
        if 0 <= x + dx[way] <= N - 1 and 0 <= y + dy[way] <= N - 1:
            if IsVisited[x + dx[way]][y + dy[way]] is False and grid[x + dx[way]][y + dy[way]] > h:
                IsVisited[x + dx[way]][y + dy[way]] = True
                dfs(x + dx[way], y + dy[way], h)
            else:
                IsVisited[x + dx[way]][y + dy[way]] = True
                continue
        else:
            continue
    return


def dfs_stack(x, y, h):
    stack = [(x, y)]
    while stack:
        x, y = stack.pop()

        for way in range(4):
            nx, ny = x + dx[way], y + dy[way]
            if 0 <= nx < N and 0 <= ny < N:
                if not IsVisited[nx][ny] and grid[nx][ny] > h:
                    IsVisited[nx][ny] = True
                    stack.append((nx, ny))


ansH = 0

for h in range(0, _max+1):
    currentMax = 0
    IsVisited = [[False] * N for i in range(N)]

    for i in range(N):
        for j in range(N):
            if not IsVisited[i][j] and grid[i][j] > h:
                IsVisited[i][j] = True
                currentMax += 1
                dfs_stack(i, j, h)

    if currentMax > ans:
        ans = currentMax
        ansH = h





print(ans)

주석으로 달 설명

완전탐색. 그 두번째이다.

이번에는 기존의 완전탐색을 할 때 재귀적으로 처음에 진행하였지만, 곧이어 최대 재귀 호출 도착 에러에 봉착해버렸다.

백준의 경우, python 재귀 최대 가능 depth 는 1,000이고, 현재 조건은 N이 100이 될 수 있으므로, 나의 기존 재귀적인 DFS 방식의 코드는 최악의 경우 10,000번의 재귀호출에 도착할 수 있다.

곧이어, 이에 따라 재귀적으로 구현한 코드를 stack을 이용한 DFS로 교체하였다. 물론, 완전탐색이기 때문에, BFS로 교체하는 것 역시 아무 상관 없다.

마지막으로, 비의 깊이가 어느정도인지의 대한 범위가 없다. 즉, 비가 0만큼 올 수 있다는 점이 추가적으로 수정한 사항이다.

This post is licensed under CC BY 4.0 by the author.