250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- IN
- MySQL
- 자료구조
- C++
- Reinforcement Learning
- MinHeap
- machine learning
- classification
- Mask Processing
- image processing
- 머신러닝
- sklearn
- exists
- 인공지능
- SIFT
- dfs
- opencv
- edge detection
- Python
- 그래프 이론
- clustering
- canny edge detection
- DP
- TD
- BFS
- AlexNet
- dynamic programming
- 딥러닝
- 백준
- 강화학습
Archives
- Today
- Total
JINWOOJUNG
[ 그래프 이론-2468 ] 안전 영역(Python) 본문
728x90
반응형
접근법
처음에는 N으로 입력값은 높이에 대한 안전 영역 을 계산하였지만 문제를 잘못 접근 한 것이었다.
높이가 최소인 1부터, 각 위치의 높이가 쵀대인 값 까지 모두 고려하였을 때, 안전 영역이 최대가 되는 경우를 생각해야 한다. 즉 높이가 1부터 최대로 H까지 존재한다면,1~H 이하인 지점을 모두 잠기게 만드는 상황을 고려해야 한다.
만약 H이하인 경우 모두 잠기기 때문에 1~H-1까지 고려해서 최대인 안전 영역 을 계산하면 된다.
dfs()로 접근하여 해결하였으며, 여러번 계산해야 하므로 할때마다 방문한 위치를 표시하기 위한 변수 visited와 안전 영역 의 개수인 cnt를 초기화 한다.
정답
import sys
sys.setrecursionlimit(10**9)
N = int(input())
land = []
di = [0,0,-1,1]
dj = [1,-1,0,0]
def dfs(i, j,h,visited):
visited[i][j] = 1
for k in range(4):
I = i+di[k]
J = j+dj[k]
if 0 <= I < N and 0 <= J < N:
if land[I][J] >h and visited[I][J] ==0:
dfs(I,J,h,visited)
cnt = 0
max = 0
for i in range(N):
tmp = list(map(int,sys.stdin.readline().split(" ")))
land.append(tmp)
for j in range(N):
if land[i][j] > max:
max = land[i][j]
maxCnt = 0
for h in range(max):
visited = [[0]*N for _ in range(N)]
cnt = 0
for i in range(N):
for j in range(N):
if land[i][j] > h and visited[i][j] == 0:
cnt += 1
dfs(i,j,h,visited)
if cnt > maxCnt:
maxCnt = cnt
print(maxCnt)
각 위치의 높이가 h보다 크고 아직 방문하지 않은 위치에 대하여 dfs를 적용하면 된다.
재귀적으로 동작하므로 sys.setrecursionlimit()를 해 줘야 한다.
728x90
반응형
'백준' 카테고리의 다른 글
[ 그래프 이론 - 4963 ] 섬의 개수(Python) (0) | 2024.01.03 |
---|---|
[ 그래프 이론-11724 ] 연결 요소의 개수(Python) (1) | 2024.01.02 |
[ 그래프 이론-2668 ] 숫자고르기(Python) (0) | 2023.12.30 |
[ 자료구조-1253 ] 좋다(Python) (0) | 2023.12.29 |
[ 자료구조-1715 ] 카드 정렬하기(Python) (0) | 2023.12.28 |