취준/백준
[백준][Python][2667][BFS] 단지번호붙이기
puff
2020. 4. 29. 16:21
문제 : https://www.acmicpc.net/problem/2667
BFS 문제다.
기본적으로 쓰는 queue와 방문 확인용 v 배열은 그대로 쓴다.
그리고, 2중 for를 통해 모든 맵에서 bfs를 시작한다.
이때, 방문 v 배열은 모든 bfs에서 공통으로 사용한다.
for문을 돌면서 각 단지가 연결되어 있는 경우 (d [i][j]==1) q에 넣는데, 이때 block이라는 queue도 하나 만든다.
그리고, bfs가 끝나면 ret+=1을 한다.
물론 중복 방문을 막기위해 if v [i][j]==True를 bfs전에 확인한다. 물론 d [i][j] 단지가 없는 경우도 확인한다.
이 block은 각 단지의 사이즈를 계산하기 위해 넣는데, bfs가 끝나면 길이를 계산해서 val 배열에 추가한다.
그 후, ret,val을 문제에 맞게 출력한다
import sys
from collections import deque
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
n = int(sys.stdin.readline())
d = []
for i in range(n):
d.append([int(i) for i in sys.stdin.readline().strip()])
v = [[False]*n for _ in range(n)]
ret = 0
val = []
for i in range(n):
for j in range(n):
q = deque()
block = deque()
if v[i][j] == True or d[i][j] == 0:
continue
v[i][j] = ret
q.append((i, j))
block.append((i, j))
while q:
y, x = q.popleft()
v[y][x] = True
for a in range(4):
cy, cx = y+dy[a], x+dx[a]
if 0 <= cy < n and 0 <= cx < n:
if v[cy][cx] == False and d[cy][cx] == 1:
q.append((cy, cx))
block.append((cy, cx))
v[cy][cx] = True
ret = ret + 1
val.append(len(block))
print(ret)
for c in sorted(val):
print(c)