문제
https://www.acmicpc.net/problem/2583
풀이
입력에 따라 직사각형을 입력받고,
bfs를 통해 영역을 판별하여 넓이를 구하면 되는 문제이다.
입력을 받을 때, 모눈종이의 왼쪽 아래 꼭짓점의 좌표가 (0,0)으로 선언되어있어 약간 헷갈렸으나
우리가 아는 대로(왼쪽 위가 (0,0)좌표) 코드를 작성해도 답을 도출하는 데에는 전혀 문제가 없다.
코드
from collections import deque
row, column, k = map(int,input().split())
matrix = [[1 for _ in range(column)] for _ in range(row)]
for _ in range(k):
lx,ly,rx,ry = map(int,input().split())
for i in range(lx,rx):
for j in range(ly,ry):
matrix[j][i] = 0
lst = []
visited = [[False for _ in range(column)] for _ in range(row)]
# 동서남북
dx = [1,-1,0,0]
dy = [0,0,1,-1]
# matrix의 값이 1인 영역의 넓이 구하기
for i in range(row):
for j in range(column):
# 방문하지 않은 좌표에 대해 bfs 검사
if not visited[i][j] and matrix[i][j] == 1:
q = deque()
q.append((i,j))
visited[i][j] = True
value = 1
while q:
x,y = q.popleft()
for d in range(4):
nx,ny = x+dx[d], y+dy[d]
if 0<=nx<row and 0<=ny<column and not visited[nx][ny] and matrix[nx][ny] == 1:
visited[nx][ny] = True
value += 1
q.append((nx,ny))
lst.append(value)
lst.sort()
print(len(lst))
for i in lst:
print(i,end = " ")
'Algorithm > Backjoon' 카테고리의 다른 글
[백준] 1038 파이썬 - 감소하는 수 (0) | 2024.09.20 |
---|---|
[백준] 23881 파이썬 - 선택 정렬 1 (1) | 2024.09.17 |
[백준] 15686번 파이썬 - 치킨 배달 (0) | 2024.08.30 |
[백준] 18405번 파이썬 - 경쟁적 전염 (0) | 2024.08.27 |
[백준] 12015번 파이썬 - 가장 긴 증가하는 부분 수열 2 (0) | 2024.06.27 |