๐Ÿ’ป

[๋ฐฑ์ค€] DFS์™€BFS - 2583. ์˜์—ญ ๊ตฌํ•˜๊ธฐ(BFSํ’€์ด) ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฌธ์ œํ’€์ด Baekjoon

[๋ฐฑ์ค€] DFS์™€BFS - 2583. ์˜์—ญ ๊ตฌํ•˜๊ธฐ(BFSํ’€์ด)

๋˜ํšจ๋‹ˆ 2020. 3. 8. 19:01

๋ฌธ์ œ

๋ˆˆ๊ธˆ์˜ ๊ฐ„๊ฒฉ์ด 1์ธ M×N(M,N≤100)ํฌ๊ธฐ์˜ ๋ชจ๋ˆˆ์ข…์ด๊ฐ€ ์žˆ๋‹ค. ์ด ๋ชจ๋ˆˆ์ข…์ด ์œ„์— ๋ˆˆ๊ธˆ์— ๋งž์ถ”์–ด K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•์„ ๊ทธ๋ฆด ๋•Œ, ์ด๋“ค K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•์˜ ๋‚ด๋ถ€๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์ด ๋ช‡ ๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด M=5, N=7 ์ธ ๋ชจ๋ˆˆ์ข…์ด ์œ„์— <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ™์ด ์ง์‚ฌ๊ฐํ˜• 3๊ฐœ๋ฅผ ๊ทธ๋ ธ๋‹ค๋ฉด, ๊ทธ ๋‚˜๋จธ์ง€ ์˜์—ญ์€ <๊ทธ๋ฆผ 2>์™€ ๊ฐ™์ด 3๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง€๊ฒŒ ๋œ๋‹ค.

<๊ทธ๋ฆผ 2>์™€ ๊ฐ™์ด ๋ถ„๋ฆฌ๋œ ์„ธ ์˜์—ญ์˜ ๋„“์ด๋Š” ๊ฐ๊ฐ 1, 7, 13์ด ๋œ๋‹ค.

M, N๊ณผ K ๊ทธ๋ฆฌ๊ณ  K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•์˜ ์ขŒํ‘œ๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜• ๋‚ด๋ถ€๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์ด ๋ช‡ ๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง€๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ถ„๋ฆฌ๋œ ๊ฐ ์˜์—ญ์˜ ๋„“์ด๊ฐ€ ์–ผ๋งˆ์ธ์ง€๋ฅผ ๊ตฌํ•˜์—ฌ ์ด๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— M๊ณผ N, ๊ทธ๋ฆฌ๊ณ  K๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค. M, N, K๋Š” ๋ชจ๋‘ 100 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ K๊ฐœ์˜ ์ค„์—๋Š” ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ง์‚ฌ๊ฐํ˜•์˜ ์™ผ์ชฝ ์•„๋ž˜ ๊ผญ์ง“์ ์˜ x, y์ขŒํ‘œ๊ฐ’๊ณผ ์˜ค๋ฅธ์ชฝ ์œ„ ๊ผญ์ง“์ ์˜ x, y์ขŒํ‘œ๊ฐ’์ด ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฐจ๋ก€๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋ชจ๋ˆˆ์ข…์ด์˜ ์™ผ์ชฝ ์•„๋ž˜ ๊ผญ์ง“์ ์˜ ์ขŒํ‘œ๋Š” (0,0)์ด๊ณ , ์˜ค๋ฅธ์ชฝ ์œ„ ๊ผญ์ง“์ ์˜ ์ขŒํ‘œ๋Š”(N,M)์ด๋‹ค. ์ž…๋ ฅ๋˜๋Š” K๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜•๋“ค์ด ๋ชจ๋ˆˆ์ข…์ด ์ „์ฒด๋ฅผ ์ฑ„์šฐ๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค.

 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋ถ„๋ฆฌ๋˜์–ด ๋‚˜๋ˆ„์–ด์ง€๋Š” ์˜์—ญ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ๊ฐ ์˜์—ญ์˜ ๋„“์ด๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ถœ๋ ฅํ•œ๋‹ค.

 

์˜ˆ์ œ ์ž…๋ ฅ1

5 7 3
0 2 4 4
1 1 2 5
4 0 6 2

 

์˜ˆ์ œ ์ถœ๋ ฅ1

3
1 7 13

 

์ƒ๊ฐ

์ฃผ์–ด์ง„ ๋ฌธ์ œ์—์„œ (x, y) ์ขŒํ‘œ๊ฐ€ ์™ผ์ชฝ ์•„๋ž˜์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘์ธ๋ฐ, ๊ทธ๋™์•ˆ ๋ฌธ์ œ ํ’€์ด ํ•  ๋•Œ ์™ผ์ชฝ ์œ„๋ถ€ํ„ฐ๋กœ ํ•ด์„œ ํ’€์—ˆ์œผ๋‹ˆ๊น ๋ฐ”๊ฟ”์„œ ์ต์ˆ™ํ•œ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด ํ’€์—ˆ๋‹ค. 

 

์ง์‚ฌ๊ฐํ˜•์— ํ•ด๋‹นํ•˜๋Š” ์˜์—ญ์—๋Š” 1์˜ ๊ฐ’์„ ๋„ฃ์—ˆ๊ณ , ์šฐ๋ฆฌ๋Š” ๋ถ„๋ฆฌ๋œ ์˜์—ญ์— ๊ด€์‹ฌ์„ ๋‘์–ด์•ผํ•˜๋ฏ€๋กœ map[i][j] = 0 ์ผ๋•Œ ๋ฐฉ๋ฌธํ•ด์ค€๋‹ค. cnt๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งˆ๋‹ค 1์”ฉ ์ฆ๊ฐ€ํ•ด์คฌ๊ณ  ๊ทธ๋ ‡๊ฒŒ ๊ตฌํ•œ ๊ฐ’์„ ๋ฒกํ„ฐ์— ๋„ฃ์–ด์คฌ๋‹ค. 

 

๋ฌธ์ œ ์ž์ฒด๋Š” ์ผ๋ฐ˜์ ์ธ BFS, DFS๋ฌธ์ œ ์˜€๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ค์šด ๊ฒƒ์€ ์•„๋‹ˆ์—ˆ์œผ๋‚˜ ์ขŒํ‘œ์—์„œ ๊ผฌ์—ฌ์„œ ์‹œ๊ฐ„์„ ์žก์•„๋จน์—ˆ๋‹ค. (x, y) -> (N, M) ์ธ๋ฐ ์ž…๋ ฅ ๋ฐ›์€ ์ˆœ์„œ๋Œ€๋กœ for๋ฌธ ๋Œ ๋•Œ m, n์œผ๋กœ ํ•ด์„œ ํ’€์—ˆ๋‹ค๊ฐ€ ๋‹ค ๊ผฌ์ด๊ณ  ๋‹ต์ด ์ด์ƒํ•˜๊ฒŒ ๋‚˜์™€์„œ ํ•œ์ฐธ์„ ํ—ค๋งธ๋‹ค.

 

์ด์ „์— ํ’€์—ˆ๋˜ ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ ๋ฌธ์ œ๋ž‘ ๋น„์Šทํ•œ ๋ฌธ์ œ์˜€๋‹ค. ๋‹จ์ง€๋Š” DFS๋กœ ํ’€์—ˆ๊ณ , ์ด ๋ฌธ์ œ๋Š” BFS๋ฅผ ์ด์šฉํ•ด์„œ ํ’€์—ˆ๋‹ค. ๋น„๊ตํ•ด์„œ ๋ณด์•„๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

2020/02/20 - [์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฌธ์ œํ’€์ด] - [๋ฐฑ์ค€] DFS์™€BFS - 2667. ๋‹จ์ง€๋ฒˆํ˜ธ๋ถ™์ด๊ธฐ(DFSํ’€์ด)

 

 

์ž‘์„ฑํ•œ ์ฝ”๋“œ

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
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
 
using namespace std;
 
int m,n,k;
int map[101][101= {0,};
bool visited[101][101];
vector<int> v;
//์ƒ, ํ•˜, ์ขŒ, ์šฐ
int dx[] = {-1,1,0,0};
int dy[] = {0,0,-1,1};
int x, y, z, w;
int cnt;
 
void BFS(int a, int b){
    cnt = 1;
    queue<pair<int,int> > q;
    q.push(make_pair(a, b));
    visited[a][b] = true;
    
    while(!q.empty()){
        int x = q.front().first;
        int y = q.front().second;
        q.pop();
        
        for(int i=0; i<4; i++){
            int nx = x+dx[i];
            int ny = y+dy[i];
            if(nx<0 || ny<0 || nx>=|| ny>=m){
                continue;
            }
            if(map[nx][ny]==0 && !visited[nx][ny]){
                cnt ++;
                visited[nx][ny] = true;
                q.push(make_pair(nx, ny));
            }
        }
    }
    v.push_back(cnt);
}
void draw(int a, int b, int c, int d){
    for(int i=a; i<c; i++){
        for(int j=b; j<d; j++){
            map[i][j] = 1;
        }
    }
}
int main(int argc, const char * argv[]) {
    // insert code here...
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    cin >> m >> n >> k;
    
    for(int i=0; i<k; i++){
        cin >> x >> y >> z >> w;
        draw(x, y, z, w);
    }
 
    for(int i=0; i<n; i++){
        for(int j=0; j<m; j++){
            if(map[i][j]==0 && !visited[i][j]){
                BFS(i, j);
            }
        }
    }
    sort(v.begin(), v.end());
 
    cout << v.size() << "\n";
 
    for(int i=0; i<v.size(); i++){
        cout << v[i] << " ";
    }
 
    return 0;
}
 
Colored by Color Scripter
๋ฐ˜์‘ํ˜•
Comments