algorithm/문제
[Python] 백준 2583 번 영역구하기/bfs
유랄라-
2022. 1. 30. 15:49
반응형
https://www.acmicpc.net/problem/2583
2583번: 영역 구하기
첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오
www.acmicpc.net
from collections import deque
import sys
input=sys.stdin.readline
m,n,k=map(int, input().split())
info=[]
for _ in range(k):
info.append(list(map(int,input().split())))
graph=[[0]*m for _ in range(n)]
for item in info:
start_x, start_y, end_x, end_y = item
for x in range(start_x,end_x):
for y in range(start_y,end_y):
graph[x][y]=1
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs(x,y):
result =1
queue = deque()
queue.append((x,y))
graph[x][y]=1
while queue:
x,y=queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or nx >= n or ny < 0 or ny >= m:
continue
if graph[nx][ny] == 0:
graph[nx][ny]=1
result += 1
queue.append((nx,ny))
return result
result=[]
for i in range(n):
for j in range(m):
if(graph[i][j]==0):
result.append(bfs(i,j))
result.sort()
print(len(result))
for i in result:
print(i,end=' ')
0으로 채워진 배열(graph)에 직사각형이 그려진 곳은 1로 채운다.
그리고 그래프가 0인공간마다 bfs함수를 실행해서 빈공간의 수(result)를 세며 방문한 곳은 1로 채운다.
result값을 리스트에 추가하고 정렬한뒤 프린트한다.
반응형