Algorithm
[BaekJoon] 백준 알고리즘 1926번 / 그림 / BFS / Python
bkuk
2023. 2. 27. 13:26
"""
1. 아이디어
- 2중 for => 값 1 && 방문X ==> BFS
- BFS 돌면서 그림 개수 + 1, 최대값 갱신
2. 시간 복잡도
- BFS : O(V+E)
- V : 500 * 500
- E : 4 * 500 * 500
- V + E : 5 * 250000 = 100만 < 2억 >> 가능!
3. 자료구조
- 그래프 전체 지도 : input[][]
- 방문 : bool[][]
- Queue( BFS )
"""
import sys
input = sys.stdin.readline
# n(세로), m(가로) 입력받는다.
n, m = map( int, input().split() )
# 그림의 전체 지도를 n개의 list 생성
map = [list(map( int, input().split())) for _ in range(n)]
# 방문정보 list 생성
chk = [[False] * m for _ in range(n)]
# dy, dx 정의
dy = [ 0, 1, 0, -1 ]
dx = [ 1, 0, -1, 0 ]
# bfs 함수 정의
def bfs( y, x):
rs = 1
q = [( y, x)]
while q:
ey, ex = q.pop()
for k in range( 4 ):
ny = ey + dy[k]
nx = ex + dx[k]
if 0 <= ny < n and 0 <= nx < m:
if map[ny][nx] == 1 and chk[ny][nx] == False:
rs += 1
chk[ny][nx] = True
q.append(( ny,nx ))
return rs
# 전체 그림 카운트
cnt = 0
# 최대 그림 크기 value
maxV = 0
for j in range(n):
for i in range(m):
# 그림이 1이면서 방문하지 않았다면
if map[j][i] == 1 and chk[j][i] == False:
# 방문했다면 체크
chk[j][i] = True
# 전체 그림 갯수 +1
cnt += 1
# 최대값 갱신
maxV = max( maxV, bfs( j, i) )
print( cnt )
print( maxV )