반응형
문제
https://www.acmicpc.net/problem/2583
2583번: 영역 구하기
첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오
www.acmicpc.net
코드
import sys
sys.setrecursionlimit(10**7)
m, n, k = map(int, input().split())
ans = []
paper = [(list(0 for i in range(n))) for i in range(m)]
for _ in range(k):
x, y, dx, dy = map(int, input().split())
for i in range(x, dx):
for j in range(y, dy):
paper[j][i] = 1
dx = [1, -1, 0, 0]
dy = [0, 0, 1, -1]
def dfs(x, y):
global cnt
cnt += 1
paper[x][y] = 1
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < m and 0 <= ny < n and paper[nx][ny] == 0:
dfs(nx, ny)
return cnt
cnt = 0
for i in range(m):
for j in range(n):
if paper[i][j] == 0:
ans.append(dfs(i, j))
cnt = 0
print(len(ans))
for i in sorted(ans):
print(i, end = ' ')
설명
dfs를 통해서 해결했다.
문제의 접근 자체는 굉장히 빠르게 했는데,
x와 y의 범위에 대한 실수가 잦았다.
우선 n, m 만큼의 모눈종이를 0으로 세팅해 준다.
그리고 직사각형의 꼭짓점 좌표를 받아 해당 부분을 1로 처리해 준다.
이후에 dfs를 진행한다.
dfs의 횟수를 체크하기 위해 global을 통해 cnt를 설정해서 카운트해 주었고,
dfs가 종료될 때 cnt값을 리턴하여 정답 리스트에 넣어주었다.
이후 몇 개의 영역으로 나누어지는지를 출력하기 위해 정답 리스트의 개수를 써주었고(dfs의 진행 횟수만큼 영역이 존재)
sorted 된 ans에서 각 영역의 넓이를 출력했다.
반응형
'개발 연습장 > 백준 문제풀이' 카테고리의 다른 글
[파이썬, Python] 백준 7562: 나이트의 이동 (1) | 2023.10.28 |
---|---|
[파이썬, Python] 백준 14940: 쉬운 최단거리 (0) | 2023.10.18 |
[파이썬, Python] 백준 1987: 알파벳 (0) | 2023.07.28 |
[파이썬, Python] 백준 5525: IOIOI (0) | 2023.07.27 |
[파이썬, Python] 백준 11725: 트리의 부모 찾기 (0) | 2023.07.26 |