반응형
문제
풀이
일반적인 dfs, bfs 문제입니다.
저는 bfs로 풀었습니다.
입력을 받고, 사각형이 있는 위치를 1, 없는 위치를 0으로 초기화해줍니다.
bfs를 실행하면서 개수와 영역의 넓이를 구합니다.
영역은 vector에 push 해준 뒤, 오름차순으로 정렬하여 출력합니다.
소스 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
int M, N, K;
int map[100][100];
bool visited[100][100];
// 개수
int cnt;
// 영역의 넓이
int width;
int dx[] = { 0, 0, -1, 1 };
int dy[] = { -1, 1, 0, 0 };
vector<int> v;
void bfs(int fx, int fy)
{
// 방문했으면 return
if (visited[fy][fx])
return;
visited[fy][fx] = true;
// 0이 아니라면 return
if (map[fy][fx] == 1)
return;
queue<pair<int, int>> q;
q.push(make_pair(fx, fy));
width = 0;
while (!q.empty())
{
int x = q.front().first;
int y = q.front().second;
q.pop();
if (map[y][x] == 0)
{
width++;
for (int i = 0; i < 4; i++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if (nx >= 0 && nx < N && ny >= 0 && ny < M)
{
if (!visited[ny][nx])
{
visited[ny][nx] = true;
q.push(make_pair(nx, ny));
}
}
}
}
}
// 0을 방문해줬으므로 cnt++, 영역 크기 저장
cnt++;
v.push_back(width);
}
int main()
{
cin >> M >> N >> K;
for (int i = 0; i < K; i++)
{
int sx, sy, ex, ey;
cin >> sx >> sy >> ex >> ey;
for (int j = sy; j < ey; j++)
{
for (int k = sx; k < ex; k++)
{
map[j][k] = 1;
}
}
}
for (int i = 0; i < M; i++)
{
for (int j = 0; j < N; j++)
{
bfs(j, i);
}
}
// 정렬
sort(v.begin(), v.end());
cout << cnt << endl;
for (int i = 0; i < v.size(); i++)
{
cout << v[i] << ' ';
}
return 0;
}
|
cs |
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 3190] 뱀 C++ (0) | 2021.09.12 |
---|---|
[백준 14502] 연구실 C++ (0) | 2021.09.11 |
[백준 1992] 쿼드트리 (C++) (0) | 2021.09.09 |
[백준 1759] 암호 만들기 (C++) (0) | 2021.09.08 |
[백준 2156] 포도주 시식 (C++) (0) | 2021.09.07 |