Skip to content

Commit 6db6e68

Browse files
committed
[BOJ]#2468. 안전영역/실버1/1h 12min
https://www.acmicpc.net/problem/2468
1 parent 6f01f3c commit 6db6e68

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed

Hongjoo/백준/안전영역.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
""""
2+
실버1
3+
https://www.acmicpc.net/problem/2468
4+
# 조건 :
5+
(1) 물에 잠기지 않은 구역 위치 구하기
6+
(2) 안 잠긴 구역들의 군집 개수 찾기
7+
- 상하좌우로 연결된 구역 = 1 군집
8+
# 유형: 노드 탐색 -> BFS/DFS
9+
연결된 노드들이 이루는 군집 개수 구하는 문제
10+
11+
12+
"""
13+
import sys
14+
from collections import deque
15+
input = sys.stdin.readline
16+
17+
n = int(input())
18+
field = []
19+
limit_list= set()
20+
limit_list.add(0)
21+
# 1. 물에 잠김, 생존 구역으로 구분한 field 만들기
22+
for i in range(n):
23+
tmp = list(map(int,input().split()))
24+
for j in range(n) :
25+
# limit_list 수집하기 = 노드의 높이 값 종류
26+
limit_list.add(tmp[j])
27+
field.append(tmp)
28+
# print(f"field - {limit_list}")
29+
30+
31+
# 종류별 limit에 따라 지대 높이가 limit 이하일 경우 침수되는 지역, 생존 지역 명시
32+
# board : 생존 여부 + 방문 여부 확인 flag 역할
33+
def init_board(limit) :
34+
# 각 limit 별로 침수되는 지역을 확인하기
35+
board = [[0 for _ in range(n)] for k in range(n) ]
36+
saved_point = []
37+
# 침수 지역 맵 업데이트하기
38+
for i in range(n):
39+
for k in range(n):
40+
if field[i][k] <= limit : # 침수 지역
41+
board[i][k] =-1
42+
else :
43+
# 생존 지역
44+
saved_point.append([i,k])
45+
return board,saved_point
46+
47+
# 2. 생존 구역들의 군집 개수 구하기
48+
#상하좌우
49+
dy =[-1,1,0,0 ]
50+
dx = [0,0,-1,1]
51+
def bfs(sy,sx , field):
52+
# (1)시작점 정의
53+
q = deque()
54+
q.append([sy,sx])
55+
field[sy][sx] = 1 # 방문 등록
56+
# (2)인접한 노드
57+
while q :
58+
cy,cx =q.popleft()
59+
for dw in range(4):
60+
ny,nx = cy + dy[dw] , cx +dx[dw]
61+
# 2-1 필드 범위에서 벗어나는지 확인
62+
# 2-2방문 여부 확인
63+
if 0<= ny < n and 0<= nx < n and field[ny][nx] == 0 : # 방문 안했으면 업데이트
64+
q.append([ny,nx])
65+
field[ny][nx] = 1
66+
67+
return 0
68+
# main 함수
69+
max_cnt = 0
70+
for limit in limit_list : #limit 을 1개씩 조합해봄
71+
board,saved_point = init_board(limit)
72+
# print(f"##{limit} : {saved_point}")
73+
cnt = 0
74+
# 생존 구역에서 확인
75+
for y,x in saved_point :
76+
if board[y][x] == 0 :#방문 안했으면 -> bfs 탐색 진행
77+
bfs(y,x, board)
78+
cnt +=1
79+
80+
max_cnt = max(max_cnt , cnt)
81+
print(max_cnt)

0 commit comments

Comments
 (0)