- 문제 링크: https://www.acmicpc.net/problem/2468
- BFS/DFS
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
반응형
'Algorithm' 카테고리의 다른 글
| [프로그래머스 BFS | python] 게임 맵 최단거리 (0) | 2025.07.23 |
|---|---|
| [카카오 코테 2020 | python] 키패드 누르기 (0) | 2025.07.04 |
| [프로그래머스 DP | python] 도둑질 🔥 (0) | 2025.07.01 |
| [카카오 코테 2023 | python] 이모티콘 할인행사 (0) | 2025.07.01 |
| [카카오 코테 2020 | python] 문자열 압축 ✅ (0) | 2025.06.27 |