포도가게의 개발일지

python 백준 2583 영역 구하기 본문

백준

python 백준 2583 영역 구하기

grape.store 2021. 8. 24. 22:34
반응형

백준 2583 영역 구하기

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

 

2583번: 영역 구하기

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

www.acmicpc.net

1. 문제 : 영역이 표시되지 않은 직사각형의 개수와 넓이 파악

2.접근법

 - 배열의 개수가 곧 넓이

 - 재귀 리밋 error로 100*100 = 10000을 설정해주었다

3. Dfs를 이용한 영역 확인 및 넓이 체크

import sys
sys.stdin = open('inputs.text')
sys.setrecursionlimit(10000)

m,n,c = map(int,sys.stdin.readline().split())
matrix = [[0]*n for _ in range(m)]
visit = [[0]*n for _ in range(m)]
zero_loca = []
for _ in range(c):
    x1,y1,x2,y2 = map(int,sys.stdin.readline().split())
    for j in range(y1,y2):
        for i in range(x1,x2):
            matrix[j][i] = 1
for j in range(m):
    for i in range(n):
        if matrix[j][i] == 0:
            zero_loca.append([j,i])

def dfs(y,x):
    global maximum, count

    count += 1
    if count > maximum:
        maximum = count
    visit[y][x] = 1
    for i in range(4):
        ny = y + dy[i]
        nx = x + dx[i]
        if ny<0 or nx<0 or ny>=m or nx>=n:
            continue
        if matrix[ny][nx] > 0 or visit[ny][nx]>0:
            continue
        
        maximum = dfs(ny,nx)

    return maximum

dx = [1,-1,0,0]
dy = [0,0,1,-1]
answer = []            
for y,x in zero_loca:
    maximum = 1
    count = 0
    if visit[y][x] == 0:
        answer.append(dfs(y,x))
answer = sorted(answer)
print(len(answer))
print(*answer)

'백준' 카테고리의 다른 글

python 백준 2638 치즈  (0) 2021.08.25
python 백준 16236 아기상어  (0) 2021.08.24
python 백준 2623 음악 프로그램  (0) 2021.08.23
python 백준 2617 구슬 찾기  (0) 2021.08.23
python 백준 2573 빙산  (0) 2021.08.23
Comments