이제 bfs 문제 보면 대충 그림+빙산 조합으로 풀면 되겠네...이런 생각 함
from collections import deque
m, n, k = map(int, input().split())
arr = [[0 for _ in range(n)] for _ in range(m)]
for _ in range(k):
x1, y1, x2, y2 = map(int, input().split())
for y in range(y1, y2):
for x in range(x1, x2):
arr[m - y - 1][x] = 1
dx = [0, 0, 1, -1]
dy = [1, -1, 0, 0]
def bfs(y, x, visited):
q = deque()
q.append((y, x))
visited[y][x] = 1
cnt = 1
while q:
cur_y, cur_x = q.popleft()
for i in range(4):
x_ = cur_x + dx[i]
y_ = cur_y + dy[i]
if 0 <= x_ < n and 0 <= y_ < m and visited[y_][x_] == 0 and arr[y_][x_] == 0:
visited[y_][x_] = 1
q.append((y_, x_))
cnt += 1
return cnt
visited = [[0 for _ in range(n)] for _ in range(m)]
cnt = 0
areas = []
for i in range(m):
for j in range(n):
if visited[i][j] == 0 and arr[i][j] == 0:
area_size = bfs(i, j, visited)
areas.append(area_size)
cnt += 1
print(cnt)
print(" ".join(map(str, sorted(areas))))
그림 문제 풀이랑 비슷한듯
근데 입력받을 때, 좌표가 좌측 하단에서 시작되는 걸 기준으로 하기 때문에
y축을 반전시켜서 입력받아야 직관적으로 풀 수 있다는 점을 조심해야될 것 같다 (m-y-1) ㅇㅇ.
그 점 제외하고는 떠올리는 것이 어렵진 않다
방문한 적이 없고, 직사각형 영역이 없는 공간이면 bfs를 돌려서 너비를 구한다
bfs 함수는 해당 영역의 너비를 return한다
각 너비를 배열에 누적 저장하고,
최종적으로 배열 요소를 sort해서 크기 순으로 공백을 두고 출력한다
이제 실버 난이도는 걍 푸는데 골드 좀 쉽게 풀고 싶다
'개발자 강화 > 코딩 테스트' 카테고리의 다른 글
[백준] 11727 2*n 타일링2 / 실3 / DP (0) | 2024.11.16 |
---|---|
[백준] 14888 연산자 끼워넣기 Python3 DFS (0) | 2024.11.15 |
[백준] 19941 햄버거 (0) | 2024.11.13 |
[백준] 2468 안전영역 BFS (2) | 2024.11.12 |
[백준] 2573 - 빙산 BFS (Python3) (0) | 2024.11.10 |