티스토리 뷰
728x90
반응형
문제
https://www.acmicpc.net/problem/2583
2583번: 영역 구하기
첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오
www.acmicpc.net
코드
import collections
m, n, k = map(int, input().split()) # m 세로, n 가로
graph = [[0]*n for _ in range(m)]
check = [[False]*n for _ in range(m)]
dx, dy = [-1, 1, 0, 0], [0, 0, -1, 1]
count = 0
result = []
def bfs(x,y):
total = 0
queue = collections.deque()
queue.append((x,y))
while queue:
total += 1
check[x][y] = True
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < m and 0 <= ny < n:
if graph[nx][ny] == 0 and check[nx][ny] == False:
check[nx][ny] = True
queue.append((nx,ny))
return total
for i in range(k):
x1,y1,x2,y2 = map(int, input().split())
for x in range(y1, y2):
for y in range(x1, x2):
graph[x][y] = 1
for x in range(m):
for y in range(n):
if graph[x][y] == 0 and check[x][y] == False:
result.append(bfs(x,y))
count+=1
result.sort()
print(count)
for i in result:
print(i, end=' ')
for문을 돌아 x1,y1, x2,y2에 범위를 입력받으면 graph에 범위안을 1로 채워준다.
그리고 1인 직사각형을 제외한 부분을 알고싶기 때문에 graph에서 0인 부분을 찾게 bfs를 돈다.
영역에 개수를 구하기 위해서 bfs함수를 시작할때마다 count를 더해주고
영역마다 안에 개수는 bfs에서 total로 while문이 반복될때마다 total에 더해주면 된다.
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 15900번, 나무 탈출 (Python) (0) | 2021.07.21 |
---|---|
[백준] 10026번, 적록색약 (Python) (0) | 2021.07.16 |
[백준] 4963번, 섬의 개수 (Python) (0) | 2021.07.15 |
[백준] 11057번, 오르막 수 (Python) (0) | 2021.07.14 |
[백준] 7562번, 나이트의 이동 (Python) (0) | 2021.07.09 |
댓글