정답
- 정사각형 범위의 좌표들은 모두 1로 마킹하고 해당 그래프에서 1이 아닌 부분만 탐색하면 됨
- 셀의 경계 좌표이기 때문에 실제로 색칠되는 칸은 이차원배열에서 돌아가는 것처럼 생각하면 됨
# 입력받은 정사각형 좌표들을 1로 마킹
for _ in range(k):
x1, y1, x2, y2 = map(int, input().split())
for y in range(y1, y2):
for x in range(x1, x2):
graph[y][x] = 1
- 2차원 배열을 돌릴 때는 y값과 x값을 잘 생각하며 돌려야 함
from collections import deque
m, n, k = map(int, input().split()) # m = 높이, n = 가로 길이
# 그래프 세팅
graph = []
for _ in range(m):
row = []
for _ in range(n):
row.append(0)
graph.append(row)
# 입력받은 정사각형 좌표들을 1로 마킹
for _ in range(k):
x1, y1, x2, y2 = map(int, input().split())
for y in range(y1, y2):
for x in range(x1, x2):
graph[y][x] = 1
# 상하좌우 세팅
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
# 0인 부분만 그래프 탐색 시작
def BFS(y, x):
queue = deque()
queue.append((y, x))
# 얘도 방문했기 때문에 1로 변경해줘야 함
graph[y][x] = 1
count = 1
while queue:
y1, x1 = queue.popleft()
for i in range(4):
nx = x1 + dx[i]
ny = y1 + dy[i]
if nx < 0 or ny < 0 or nx >= n or ny >= m:
continue
if graph[ny][nx] == 1:
continue
if graph[ny][nx] == 0:
queue.append((ny, nx))
graph[ny][nx] = 1
count = count + 1
return count
distance = []
ans = 0
for y in range(m):
for x in range(n):
if graph[y][x] == 0:
ans = ans + 1
distance.append(BFS(y, x))
distance.sort()
print(ans)
for i in distance:
print(i, end=" ")
'Algorithm' 카테고리의 다른 글
2667 단지번호붙이기 / DFS, BFS (0) | 2025.05.20 |
---|---|
2178 미로 탐색 / DFS, BFS (0) | 2025.05.19 |
2644 촌수계산 / DFS, BFS (0) | 2025.05.17 |
1389 케빈 베이컨의 6단계 법칙 / DFS, BFS (0) | 2025.05.16 |
10451 순열 사이클 / DFS, BFS (0) | 2025.05.15 |