알고리즘 문제 풀기/백준(Baekjoon)
[백준 알고리즘] 2583. 영역구하기
hibscus
2021. 3. 25. 01:36
이 문제는 좌표로 되어 있었서 조금 헷갈렸다.
그렇지만 영역을 구하는 문제이기 때문에 직사각형이 상하나 좌우로 뒤집어도 영역의 갯수는 변하지 않기 때문에
다루기 편하게 상하로 뒤집은 다음 사용해서 영역을 구했다.
M, N, K = map(int, input().split())
arr = [[0] * N for i in range(M)]
areas = []
delta = [(1, 0), (-1, 0), (0, 1), (0, -1)]
def DFS(i, j):
stack = [(i, j)]
arr[i][j] = 1
cnt = 1
while stack:
r, c = stack.pop()
for dt in range(4):
nr = r + delta[dt][0]
nc = c + delta[dt][1]
if 0 <= nr < M and 0 <= nc < N and arr[nr][nc] == 0:
arr[nr][nc] = 1
stack.append((nr, nc))
cnt += 1
return cnt
# 상하로 뒤집고, 직사각형 집어 넣기
for _ in range(K):
x1, y1, x2, y2, = map(int, input().split())
for i in range(y1, y2):
for j in range(x1, x2):
if not arr[i][j]:
arr[i][j] = 1
# 영역 찾기
for i in range(M):
for j in range(N):
if arr[i][j] == 0:
area = DFS(i, j)
areas.append(area)
areas.sort()
print(len(areas))
print(*areas)