Algorithm

[백준 | python] 안전 영역

삐롱K 2025. 8. 11. 15:40

 

Q1) 문제를 어떻게 이해했나요?
A1) NxN 격자에 각 칸의 높이가 주어진다. 비가 와서 수위 h이하의 칸은 전부 잠긴다. 잠기지 않은 칸들 중 상하좌우로 연결된 덩어리를 "안전 영역"이라고 한다. 비의 수위 h를 모든 가능한 값으로 바꿔가며 안전 영역 개수를 세어보고, 그 중 최대값을 구하는 문제
Q2) 문제를 어떻게 풀 예정인가요?
1. 0부터 최대 수위까지 탐색
2. 각 h에 대해서 모든 칸을 순회하며 영역 개수를 구함
3. 시간 복잡도 O(N^2)

 

고민했던 부분

더보기

영역을 어떻게 구하는거지? 사방이 막히는 걸 항상 다 확인하는 코드를 추가해야하나? 비효율적인 것 같은데..

그런데, 영역은 '높이 > h'인 칸들의 연결요소이고, BFS로 한 번에 싹 방문하면 큐가 비는 순간이 그 영역이 경계로 볼 수 있다. 

 

 

💡 정답

from collections import deque

N = int(input())
area = [list(map(int, input().split())) for _ in range(N)]

max_height = max(max(row) for row in area)
max_safe_zone = 0

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

def bfs(x, y, rain, visited):
    queue = deque([(x, y)])
    visited[x][y] = True

    while queue:
        cx, cy = queue.popleft()
        for i in range(4):
            nx, ny = cx + dx[i], cy + dy[i]
            if 0 <= nx < N and 0 <= ny < N:  # 격자 밖이면 못 감(경계에 막힘)
                if not visited[nx][ny] and area[nx][ny] > rain: # 이미 방문한 곳은 다시 안 감(중복 막음), # 잠긴 칸(<=rain)은 못 감(물에 막힘)
                    visited[nx][ny] = True
                    queue.append((nx, ny))

for rain in range(max_height + 1):  # 비의 높이 0부터 최대 높이까지
    visited = [[False]*N for _ in range(N)]
    safe_zone_count = 0

    for i in range(N):
        for j in range(N):
            if not visited[i][j] and area[i][j] > rain:
                bfs(i, j, rain, visited)
                safe_zone_count += 1

    max_safe_zone = max(max_safe_zone, safe_zone_count)

print(max_safe_zone)

 


[추천 강의]

 

6주 완성! 백엔드 이력서 차별화 전략 4가지 - 똑같은 이력서 속에서 돋보이는 법| 딩코딩코 - 인

현재 평점 5.0점 수강생 457명인 강의를 만나보세요. 모든 이력서가 비슷해 보이는 세상, ‘차별화’가 합격을 만듭니다. 6주간, 백엔드 실무자가 직접 전하는 실전 이력서 전략 4가지를 배우세요.

www.inflearn.com

 

38군데 합격 비법, 2025 코딩테스트 필수 알고리즘| 딩코딩코 - 인프런 강의

현재 평점 5.0점 수강생 2,019명인 강의를 만나보세요. 초보자도 쉽게 이해하는 단계별 설명으로, 막연했던 코딩 테스트가 명확해집니다. 필요한 것만 배우고 바로 실전에 적용하세요! 알고리즘,

www.inflearn.com

 

728x90
반응형