Algorithm

[백준 2583] 영역 구하기

moguogu 2024. 2. 4. 13:17

문제

https://www.acmicpc.net/problem/2583

 

2583번: 영역 구하기

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

www.acmicpc.net

알고리즘

1. 주어진 사각형의 좌표를 조회해서 해당영역을 그래프에 1로 채워준다 (초기화 0으로)

2. 2차원 그래프를 조회해서 0으로 시작되는 구역이 나올때 section의 값을 올려준다

3. bfs순회시, 방문때 이미 간 곳은 2로 바꿔준다 

코드

import sys
from collections import deque
 
def input_data():
    readl = sys.stdin.readline
    R, C, K = map(int, readl().split())
    rects = [list(map(int,readl().split())) for _ in range(K)]
    return R, C, K, rects
 
d= ((0,1),(0,-1),(1,0),(-1,0))
def Bfs(i,j):
    visited = [[0]*(C+1) for _ in range(R+1)]
    q = deque()
    q.append((i,j))
    visited[i][j] = 1
    graph[i][j] = 2 #한번 들어온 곳은 2로 변경
    cnt =0
    while q: 
        x, y= q.popleft()
        for dx ,dy in d:
            nx,ny = dx+x, dy+y 
            if not (0<=nx<R and 0<=ny<C): continue
            if visited[nx][ny] == 1 : continue            
            if graph[nx][ny] == 0:   
                cnt +=1
                graph[nx][ny] = 2
                visited[nx][ny] = 1
                q.append((nx,ny))
    return cnt+1

def Solve():
    q= deque()
    for x1,y1, x2,y2 in rects: #사각형의 구역 그리기 
        q.append((x1,y1))
        for i in range (y1,y2):
            for j in range(x1,x2):
                graph[i][j] = 1
    section =0
    width = []
    for i in range(R):
        for j in range(C):
            if graph[i][j] == 0: 
                res = (Bfs(i,j)) #bfs 알고리즘으로 영역 조회
                width.append(res)
                section +=1 #구역의 개수
    width.sort()
    return section, width
                 
 
R, C, K, rects = input_data()
width = []
sol = -1
graph = [[0]*(C+1) for _ in range(R+1)]
visited = [[0]*(C+1) for _ in range(R+1)]
sol,width = Solve()
print(sol)
for i in width:
    print(i, end=" ")

고찰

 

'Algorithm' 카테고리의 다른 글

[백준 10026] 적록색약  (2) 2024.07.24
[백준 2578] 빙고  (0) 2024.02.10
[백준 6236] 용돈 관리  (0) 2024.01.31
[백준 3055] 탈출  (1) 2024.01.31
[백준 2531] 회전 초밥  (1) 2024.01.28