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