[BaekJoon] 백준 2583번 : 영역 구하기

Updated:

2583번 : 영역 구하기


빈 배열에 사각형을 그린 뒤 빈 공간의 개수와 넓이를 구하는 문제이다.

문제에서는 배열 인덱스가 아닌 좌표평면으로 사각형 위치를 줬는데, 헷갈리지 않게 인덱스에 맞춰 그리면 된다.

즉 x, y 좌표를 j, i 에 대응시켜 그린 뒤 탐색을 수행하면 된다.


from collections import deque


def BFS(visit, start):
    visit[start[0]][start[1]] = True
    queue = deque([start])
    empty_size = 1
    dirs = [[-1, 0], [0, 1], [1, 0], [0, -1]]

    while queue:
        now_i, now_j = queue.popleft()

        for value in dirs:
            visit_i, visit_j = now_i + value[0], now_j + value[1]
            if 0 <= visit_i < N and 0 <= visit_j < M and not visit[visit_i][visit_j]:
                if arr[visit_i][visit_j] == 0:
                    queue.append([visit_i, visit_j])
                    empty_size += 1
                visit[visit_i][visit_j] = True

    return empty_size


def solution(arr):

    # 1. 주어진 사각형 그리기
    for square in squares:
        weight = square[2] - square[0]
        height = square[3] - square[1]

        # 2. 가로, 세로 길이를 구해 사각형 그리기
        for i in range(square[1], square[1] + height):
            for j in range(square[0], square[0] + weight):
                arr[i][j] = 1

    empty_cnt = 0
    empty_size = []
    visit = [[False for _ in range(M)] for _ in range(N)]
    for i in range(N):
        for j in range(M):
            # 3. 빈 공간 발견 시 탐색 시작
            if arr[i][j] == 0 and not visit[i][j]:
                empty_size.append(BFS(visit, [i, j]))
                empty_cnt += 1

    print(empty_cnt)
    print(*sorted(empty_size))


if __name__ == "__main__":
    N, M, K = map(int, input().split())
    squares = [list(map(int, input().split())) for _ in range(K)]
    arr = [[0 for _ in range(M)] for _ in range(N)]

    solution(arr)



Categories:

Updated:

Leave a comment