Leta Learns

[Python] 백준 2583번 - 영역 구하기 본문

Coding/백준

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

leta 2022. 1. 24. 13:06

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

 

2583번: 영역 구하기

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

www.acmicpc.net

아 아래가 0이고 위가 m, n이라서 인덱스 정리 다 해주어야 하는 줄 알고 한참 헤맸었는데

생각해보니까 굳이 인덱스 안 바꿔주어도 되는 문제였다.

영역만 구하면 되는 거니까 그림이 뒤집혀 있어도 상관 없었기 때문에..

쨌든 그거 해결하고 나니 순조로웠다.

 

bfs 함수 만들 때 자동적으로 가장 마지막 (n, m)인 경우 break를 넣어주었더니 여기서 에러가 났다.

: bfs 형식 암기의 폐해

 

그 부분 지우면 끝.

 

 

출력 쉽게 하려고 * 사용해서 하는 방법이 있는지 찾아보다가 얻어 걸린 문법 설명을 첨부한다.

2022.01.24 - [Python] - print(*)

 

import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
from collections import deque

def bfs(x, y):
    global areas
    visited[x][y] = 1
    area = 1
    q = deque()
    q.append((x, y))
    while q:
        x, y = q.popleft()
        # if x == n-1 and y == m-1: (이 부분)
        #     break
        dxdy = [(0, -1), (0, 1), (-1, 0), (1, 0)]
        for dx, dy in dxdy:
            new_x = x + dx
            new_y = y + dy
            if -1 < new_x < len(grid) and -1 < new_y < len(grid[0]):
                if grid[new_x][new_y] == 0 and not visited[new_x][new_y]:
                    visited[new_x][new_y] = 1
                    q.append((new_x, new_y))
                    area += 1
    areas.append(area)

m, n, k = map(int, input().split())
grid = [[0 for _ in range(n)] for _ in range(m)]
visited = [[0 for _ in range(n)] for _ in range(m)]
areas = []

for _ in range(k):
    lx, ly, rx, ry = map(int, input().split())
    for i in range(ly, ry):
        for j in range(lx, rx):
            grid[i][j] = 1

for i in range(m):
    for j in range(n):
        if grid[i][j] == 0 and not visited[i][j]:
            bfs(i, j)

print(len(areas))
print(*sorted(areas))

Comments