BOJ - 2468

주의·2023년 12월 1일
0

boj

목록 보기
25/214

백준 문제 링크
안전 영역

❓접근법

  1. DFS를 사용했다.
  2. 높이 정보인 lst와, 똑같은 배열의 크기인데 False로 이루어진 dfs_bool을 만들어준다.
  3. 상,하,좌,우 4방향을 살피면서 좌표(nx,ny)가 높이(h)보다 크고, dfs_bool[nx][ny]가 False인지 구분하는 함수 dfs를 만들어서
    위 조건에 부합하면
    dfs_bool[nx][ny] = True와 dfs(nx,ny,h)를 각각 실행시킨다.
  4. 높이 k는 lst중 가장 큰 값을 max_num으로 저장해서
    range(max_num + 1)동안 돌아준다
  5. k 동안 높이 정보(lst)의 원소를 돌며,
    lst[i][j] > k and dfs_bool[i][j] = False이면 count + 1해주고
    dfs_bool[i][j] = True와 dfs(i,j,k)를 각각 실행시키고
    answer에 count를 담아준다.
  6. max(answer)를 출력하면 끝!
import sys
sys.setrecursionlimit(100000)

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

lst = [list(map(int, sys.stdin.readline().split())) for _ in range(N)]
    
dx = [0,0,1,-1]
dy = [1,-1,0,0]

def dfs(x,y,h):
    
    for d in range(4):
        nx = x + dx[d]
        ny = y + dy[d]
            
        if (0<=nx<N) and (0<=ny<N) and (dfs_bool[nx][ny] == False) and lst[nx][ny] > h:
            dfs_bool[nx][ny] = True
            dfs(nx, ny, h)

answer = []
max_num = 0 
for i in lst:
    for j in i:
        if max_num < j:
            max_num = j
            
for k in range(j+1):
    dfs_bool = [[False] * N for _ in range(N)]
    
    count = 0
    
    for i in range(N):
        for j in range(N):
            if (dfs_bool[i][j] == False) and (lst[i][j] > k):
                count += 1
                dfs_bool[i][j] = True
                dfs(i,j,k)
    answer.append(count)
    
print(max(answer))

어려운 문제였고, 처음에 input()으로 풀었는데 계속 런타임 오류가 나서 찾아보니 sys.setrecursionlimit으로 재귀의 최대 깊이를 설정해줬어야 했다.

0개의 댓글