출처 : https://www.acmicpc.net/problem/2468
def search_safe(n, area, rain) :
# 찾아낸 안전영역 그룹의 수
cnt = 0
# 영역을 탐색했는지 체크하는 배열 (탐색 했음 = 0, 아직 안했음 = 1)
area_searched = [[1] * n for i in range(n)]
for i in range(n) :
for j in range(n) :
# 아직 탐색하지 않은 안전영역 찾으면 탐색 시작
if area[i][j] > rain and area_searched[i][j] == 1 :
cnt += 1
# 안전영역인지 탐색할 후보 영역의 좌표 목록
to_search = [[i, j]]
# 후보 목록에 값이 남아있으면 탐색 계속
while to_search :
# 깊이 우선 탐색
i, j = to_search.pop()
# 후보 영역의 좌표가 전체 범위에서 벗어났거나 이미 탐색한 영역이면 continue
if i < 0 or i >= n or j < 0 or j >= n or area_searched[i][j] == 0 :
continue
# 후보 영역이 안전영역일때
if area[i][j] > rain:
# 그 영역과 연결된 영역 탐색 후보 목록에 추가
to_search.extend([[i, j-1], [i, j+1], [i-1, j], [i+1, j]])
# 해당 영역 탐색했다고 체크
area_searched[i][j] = 0
return cnt
n = int(input())
area = []
for i in range(n) :
area.append(list(map(int, input().split())))
rain = 1
safe = -1
sol = 1
while safe != 0 :
safe = search_safe(n, area, rain)
sol = max(sol, safe)
rain += 1
print(sol)
DFS는 스택으로도, 재귀로도 구현이 가능한데 아직은 스택이 편하다.
비가 높이 1만큼 올때부터 시작해서 1씩 늘려나가다가, 안정영역의 수가 0(= 모두 잠김)이 되면 while문을 빠져나가 최대값을 출력한다.
'알고리즘 문제 풀이' 카테고리의 다른 글
백준 10844번 : 쉬운 계단 수 (Python) (0) | 2022.12.16 |
---|---|
백준 1463번 : 1로 만들기 (Python) (0) | 2022.12.15 |
백준 1083번 : 소트 (Python) (0) | 2022.12.07 |
백준 1181번 : 단어 정렬 (Python) (0) | 2022.12.05 |
백준 11729번 : 하노이의 탑 이동 순서 (Python) (0) | 2022.12.04 |
댓글