개발자 김수진

백준 - 2667(단지번호붙이기) 본문

알고리즘/백준

백준 - 2667(단지번호붙이기)

김수진장 2020. 4. 26. 17:49

   Input 값을 cin으로 받아와서 한줄씩 다 받아오기 때문에 에러 발생 

전형적인 BFS 문제로 현재 위치를 기준을 좌,우,상,하를 다 따져보고 조건에 따라 queue에 push

 

//입력값 잘 구분하기

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>

using namespace std;

int map[25][25];
int N;

int dx[4] = {1,0,-1,0};
int dy[4] = {0,1,0,-1};

vector <int> v;


int cnt =1;

void BFS(int x ,int y)
{
    cnt++;
    queue <pair<int,int>> q;
    
    q.push(make_pair(x,y));
    map[x][y]=cnt;
    int num=1;
    while(!q.empty()){
        int x1 = q.front().first;
        int y1 = q.front().second;
        
        q.pop();

        for(int i=0;i<4;i++){
            int nx = x1 + dx[i];
            int ny = y1 + dy[i];
            
            if(nx < 0 || nx >= N || ny < 0 || ny >= N)
                continue;
            if(map[nx][ny] == 1){
                q.push(make_pair(nx,ny));
                map[nx][ny] = cnt;
                num++;
            }
        }
    }
    
    v.insert(v.begin()+cnt-2,num);

}

int main(void)
{
    cin >> N;
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            scanf("%1d",&map[i][j]);
        }
    }
    
    for(int i=0;i<N;i++){
        for(int j=0;j<N;j++){
            if(map[i][j] == 1)
                BFS(i,j);
        }
    }
    
    sort(v.begin(), v.end());
    cout << v.size() << endl;
    for(int i=0;i<v.size();i++)
        cout << v[i] << endl;
    return 0;
}

'알고리즘 > 백준' 카테고리의 다른 글

15652-N과M(4)  (0) 2020.05.11
15651 - N과M(3)  (0) 2020.05.11
15650 - N과M(2)  (0) 2020.05.11
15649 - N과 M(1)  (0) 2020.05.11
14891(톱니바퀴)  (0) 2020.04.30