알고리즘

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

육빔 2024. 3. 27. 18:16
728x90
반응형

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

 

2583번: 영역 구하기

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

www.acmicpc.net

 

좌표 설정하는데 미로찾기처럼 위에서부터 0인줄알고 했다가 다시 읽어보니 거꾸로 되어있었어서 햇갈렷던 문제;

 

좌표를 색칠한 후에 나머지를 1로 모조리 칠해버리는 식으로 코드를 구현햇다.

 

만약 0이면 색칠 -> sum, cnt 증가 후 마지막에 정렬 후 출력 

 

sum = 0이면 1로 한 이유는 파고 들어가야지만 넓이가 증가되어 기본 첫번째 진입일때도 넓이가 1로 카운트 되게 설정하였다.

 

from collections import deque
m, n, k = map(int, input().split())
#m이 세로 n은 가로 즉 m은 x n은 y
arr = [[0 for _ in range(n)] for j in range(m)]
dx = [1, 0, -1 ,0]
dy = [0, 1, 0, -1]
cnt = 0
answer = []
dq = deque()

for _ in range(k):
    x1, y1, x2, y2 = map(int, input().split())

    for i in range(y1, y2):
        for j in range(x1, x2):   
            arr[i][j] = 1


for  i in range(m):
    for j in range(n):
        if arr[i][j] == 0:
            sum = 0
            cnt+=1
            dq.append((i, j))
            
            while dq:
                x, y = dq.popleft()
                for k in range(4):
                    nx = x + dx[k]
                    ny = y + dy[k]

                    if 0<=nx<m and 0<=ny<n:
                        if arr[nx][ny] == 0:
                            arr[nx][ny] = 1
                            dq.append((nx,ny))
                            sum+=1
            if sum == 0:
                sum = 1
            answer.append(sum)

answer.sort()
print(cnt)
print(*answer)

 

완성

728x90
반응형