알고리즘/백준

[백준 2583] 영역 구하기 C++

겜도리도리 2021. 9. 10. 23:22
반응형

문제

백준 2583

 

2583번: 영역 구하기

첫째 줄에 M과 N, 그리고 K가 빈칸을 사이에 두고 차례로 주어진다. M, N, K는 모두 100 이하의 자연수이다. 둘째 줄부터 K개의 줄에는 한 줄에 하나씩 직사각형의 왼쪽 아래 꼭짓점의 x, y좌표값과 오

www.acmicpc.net

풀이

일반적인 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[] = { 00-11 };
int dy[] = { -1100 };
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<intint>> 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