네모가 아닌 영역을 돌면서 끊기기 전까지 체크
import sys
sys.stdin = open('input.txt')
d = [(-1,0),(1,0), (0, -1), (0, 1)]
M, N, K = map(int, input().split())
maps = [[0 for _ in range(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):
maps[y][x] = 9999
check = {}
def bfs(start_row, start_col, cnt):
queue = []
maps[start_row][start_col] = cnt
queue.append([start_row, start_col])
check[cnt] = 1
while queue:
r, c = queue.pop(0)
for i in range(4):
nr = r+d[i][0]
nc = c+d[i][1]
if 0 <= nr < M and 0 <= nc < N and maps[nr][nc] == 0:
maps[nr][nc] = cnt
queue.append([nr, nc])
check[cnt] += 1
cnt = 1
for r in range(M):
for c in range(N):
if maps[r][c] == 0:
bfs(r, c, cnt)
cnt += 1
result = [i[1] for i in sorted(list(check.items()), key=lambda n:n[1])]
print(len(result))
for i in result:
print(i, end=' ')
Bfs 를 통해 문제를 해결했다. 반복문이 너무 많은 것 같고, 전체 배열을 반복해서 순회하는 느낌이 강해 비효율적이며 시간 복잡도에서 문제가 생기지 않을까 했는데 다행이도 통과했다.(느리지 않게!)
오랜만에 알고리즘을 풀어서 input을 받을 때와 bfs 순회법을 떠올리며 코드를 짜는게 힘들었다. 다시 1일 1알고를 하며 익숙해지도록 하자!