본문 바로가기
공부/알고리즘 문제풀이 기록

[백준 2583] 영역 구하기

by 도리언 옐로우 2023. 12. 14.

 

 

2583번: 영역 구하기

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

www.acmicpc.net

 

알고리즘 : DFS

난이도 : 실버Ⅰ

 

1. 문제요약

  • 특정 크기의 모눈종이가 주어지고, 직사각형의 왼쪽하단과 오른쪽 상단의 좌표가 주어진다.
  • 모눈종이가 직사각형으로 인해 구역이 나누어지게 되는데, 구역의 개수와 각 구역별 넓이를 오름차순으로 출력한다.

2. 구현과정

  • DFS의 전형적인 문제이다.
  • 처음 맵초기화할 때 모눈종이에서 빈 곳을 True로, 직사각형 부분을 False로 초기화해주었다.
  • dfs 함수를 정의하여 사용한다. 기본적으로 area = 1을 return하도록 정의하였는데, 인접 부분이 빈 곳이어서 이동가능한 경우에는 dfs 수행으로 이동된 부분에서 dfs를 수행하여 그 return값을 area에 더해주도록 하였다. 이로써 구역의 넓이를 리턴하게 된다.
  • answerlist에 구역의 넓이를 저장하고, 구역의 개수는 len(answerlist)를, 구역의 넓이는 answerlist를 오름차순정렬 후 unpacking 해주었다.

3. 파이썬 코드

import sys
sys.setrecursionlimit(10**6)

m,n,k = map(int,input().split())

# 모눈종이 초기화 : 직사각형 영역은 False, 빈 곳은 True로
field = [[True]*n for _ in range(m)]
for _ in range(k):
    x1,y1,x2,y2 = map(int,input().split())
    for x in range(x1,x2):
        for y in range(y1,y2):
            field[y][x] = False

# dfs 이동방향
dx = [1,-1,0,0]
dy = [0,0,1,-1]

# dfs 함수
def dfs(x,y):
    field[x][y] = False
    area = 1
    for i in range(4):
        newx, newy = x+dx[i], y+dy[i]
        if 0 <= newx < m and 0 <= newy < n and field[newx][newy]:
            area += dfs(newx,newy)
    return area

# 정답 출력
answerlist = []
for i in range(m):
    for j in range(n):
        if field[i][j]:
            answerlist.append(dfs(i,j))
answerlist.sort()
print(len(answerlist))
print(*answerlist)

'공부 > 알고리즘 문제풀이 기록' 카테고리의 다른 글

[백준 4179] 불!  (0) 2023.12.16
[백준 2667] 단지번호붙이기  (0) 2023.12.15
[백준 5427] 불  (0) 2023.12.13
[백준 7562] 나이트의 이동  (0) 2023.12.12
[백준 7569] 토마토 (3D)  (1) 2023.12.11