본문 바로가기

PS

안전 영역 [백준 2468]

1. 문제 접근 방법

- BFS, DFS 중에서 파이썬에서는 왠만하면 BFS를 쓰도록 하자

- 이 문제는 visited 배열의 선언이 필요한데, 이 배열을 for문 안에 쓰면 메모리 초과가 발생한다

-> 전역적으로 선언해서 재활용하도록 하자

- 아예 물에 안 잠기는 경우, 즉, maxHeight가 0인 경우가 존재함을 알아야 한다 

 

 

2. 코드

from collections import deque
 
N = int(input())

board = [] 
visited = [[False]*N for _ in range(N)]

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

for i in range(N):
    row = list(map(int, input().split()))
    board.append(row)
    
maxHeight = 0
maxArea = 0 


def dfs(x, y):
    
    visited[x][y] = True
    
    
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        
        if 0<=nx and nx < N and 0<=ny and ny<N and visited[nx][ny] == False:
            dfs(nx, ny)
    


for i in range(N):
    for j in range(N):
        if board[i][j] > maxHeight:
            maxHeight = board[i][j]
            

def bfs(x, y):
    
    visited[x][y] = True
    q = deque()
    q.append((x, y))
    
    
    while q:
        x, y = q.popleft()
        
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            
            if 0<=nx and nx<N and 0<=ny and ny<N and visited[nx][ny] == False:
                visited[nx][ny] = True
                q.append((nx,ny))
                



for i in range(0, maxHeight+1):
    
    
    area = 0 
    
    visited = [[False]*N for _ in range(N)]
    
    for j in range(N):
        for k in range(N):
            if board[j][k] <= i:
                visited[j][k] = True
    
    
    for j in range(N):
        for k in range(N):
            if visited[j][k] == False:
             area += 1
             bfs(j, k)
             

    maxArea = max(maxArea, area)
    
    
print(maxArea)

'PS' 카테고리의 다른 글

소수 경로 [백준 1963]  (1) 2023.10.07
벽 부수고 이동하기 [백준 2206]  (0) 2023.10.07
스타트 택시 [삼성 기출]  (0) 2023.10.07
청소년 상어 [삼성 기출]  (1) 2023.10.06
마법사 상어와 토네이도 [삼성 기출]  (1) 2023.10.06