https://www.acmicpc.net/problem/2667



유기농 배추 문제와 유사한 문제이다.
집이 연결되어 있는 곳이 전체 몇개 인지를 구하는 문제이다. 

다만, 연결되어 있는 집 각각이 총 몇개의 집이 있는지를 정렬해서 출력해주면 되는 문제이다.



입력을 받을 때 문자열 형태로 들어와서 
cin으로 맵을 표현한 int형 2차원 배열을 계속해서 입력받다보니 올바르지 못한 값이 입력된다.


그렇기 때문에 char형 문자로 입력받고 이 값을 int형 2차원 배열에 넣어줘서 1이 있는 곳을 표시할 수 있도록 하였다. 


그리고 dfs 함수를 구현할 때
cnt 라는 값을 통해서 몇개의 단지 내 집이 있는지를 return해주는 방식으로 구현하였다.




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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int dy[4]={1,-1,0,0};
int dx[4]={0,0,1,-1};
 
int N;
int arr[25][25]={0};
int visited[25][25]={0};
 
int dfs(int y,int x){
    
    
    int cnt=1;
    for(int i=0;i<4;i++){
        int ny=y+dy[i];
        int nx=x+dx[i];
        
        if(ny<0 || ny>=|| nx<0 || nx>=N)
            continue;
        
        if(arr[ny][nx]==0 || visited[ny][nx])
            continue;
        
        visited[ny][nx]++;
        cnt+=dfs(ny,nx);
    }
    
    return cnt;
}
int main(){
    
    char c;
    cin>>N;
    
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            cin>>c;
            
            if(c=='1')
                arr[i][j]=1;
        }
    }
 
 
    int ans=0//총 단지 수
    vector<int> vec; //단지내 집의 수
    
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            if(arr[i][j] && !visited[i][j]){
                ans++;
                visited[i][j]++;
                
                vec.push_back(dfs(i,j));
            }
        }
    }
    
    sort(vec.begin(),vec.end());
    
    cout<<ans<<endl;
    for(int i=0;i<vec.size();i++)
        cout<<vec[i]<<endl;
    
    return 0;
}
cs


'알고리즘(BOJ) > DFS' 카테고리의 다른 글

백준 1987번 - 알파벳  (0) 2018.01.28
백준 2468번 - 안전 영역  (3) 2018.01.28
백준 2583번 - 영역 구하기  (2) 2018.01.28
백준 1012번 - 유기농 배추  (0) 2018.01.28
백준 11403번 - 경로찾기  (0) 2018.01.28

+ Recent posts