수학과의 좌충우돌 프로그래밍

[C++] BAEKJOON 2667 단지번호붙이기 본문

알고리즘/C++

[C++] BAEKJOON 2667 단지번호붙이기

ssung.k 2019. 10. 1. 23:15

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

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수

www.acmicpc.net

 

dfs 를 이용해서 구현하였습니다.

BAEKJOON 2583 영역 구하기 문제와 동일한 풀이로 해결할 수 있습니다.

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

using namespace std;

int board[25][25];

int cnt = 0;

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

void dfs(int y, int x, int N){
    cnt++;
    board[y][x] = 0;
    
    for (int i=0;i<4;i++){
        int ny = y+dy[i];
        int nx = x+dx[i];
        
        if (0<=ny && ny<N && 0<=nx && nx <N){
            if (board[ny][nx]){
                dfs(ny,nx,N);
            }
        }
    }
}

int main(int argc, const char * argv[]) {
    
    int N;
    cin >> N;
    
    for (int i=0;i<N;i++){
        for (int j=0;j<N;j++){
            scanf("%1d", &board[i][j]);
        }
    }
   
    vector<int> v;
    
    for (int i=0;i<N;i++){
        for (int j=0;j<N;j++){
            if (board[i][j]){
                cnt = 0;
                dfs(i,j,N);
                v.push_back(cnt);
            }
        }
    }
    
    sort(v.begin(), v.end());
    
    cout << v.size() << "\n";
    for (int i=0;i<v.size();i++){
        cout << v[i] << "\n";
    }

    return 0;
}

 

 

'알고리즘 > C++' 카테고리의 다른 글

[C++] BAEKJOON 11724 연결 요소의 개수  (0) 2019.10.02
[C++] BAEKJOON 1012 유기농 배추  (0) 2019.10.01
[C++] BAEKJOON 2583 영역 구하기  (0) 2019.10.01
[C++] BAEKJOON 16282 Black Chain  (0) 2019.09.29
[C++] BAEKJOON 16283 Farm  (0) 2019.09.29
Comments