티스토리 뷰

728x90

문제

www.acmicpc.net/problem/2583

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

 

소스코드

import sys
input = sys.stdin.readline
sys.setrecursionlimit(100000)
def dfs(x, y):
    global flg
    dx = [-1, 1, 0, 0]
    dy = [0, 0, -1, 1]
    visited[y][x]=1
    flg += 1
    for i in range(4):
        nowx, nowy = x+dx[i], y+dy[i]
        if 0<=nowx<n and 0<=nowy<m and visited[nowy][nowx]==0 and arr[nowy][nowx]==0:
            dfs(nowx, nowy)
    return area

m, n, k = map(int, input().split())
arr = [[0]*n for _ in range(m)]
for _ in range(k):
    a, b, c, d = map(int, input().split())
    for i in range(b, d):
        for j in range(a, c):
            if arr[i][j] == 0:
                arr[i][j] = 1
visited = [[0]*n for _ in range(m)]
cnt = 0
area = []
flg = 0
for i in range(m):
    for j in range(n):
        if arr[i][j] == 0 and visited[i][j]==0:
            cnt += 1
            dfs(j, i)
            area.append(flg)
            flg = 0
print(cnt)
print(' '.join(map(str, sorted(area))))
반응형