2667 단지 번호 붙이기

DFS나 BFS를 통한 브루트포스..

DFS로 풀기

#include <iostream>
#include <vector>
#include <stdio.h>
#include <algorithm>

using namespace std;

int num;
int apart[25][25];
int visited[25][25];
int direction[4][2] = {
    {0, -1}, {1,0},
    {0, 1}, {-1, 0}
};

void countDanji(int r, int c, bool &isFirst, vector<int>& count) {
    if(apart[r][c] == 0 || r >= num || c>= num || r<0 || c<0|| visited[r][c]) {
        return;
    }

    visited[r][c] = true;
    if(isFirst) {
        isFirst = false;
        count.push_back(1);
    } else {
        int index = (int) count.size() - 1;
        count[index] += 1;
    }

    for(int i= 0; i<4; i++) {
        int nextRow = r + direction[i][0];
        int nextCol = c + direction[i][1];
        countDanji(nextRow, nextCol, isFirst, count);
    }
}

int main(int argc, const char * argv[]) {
    cin>>num;
    vector <int> count;
    cin.ignore();
    for(int i = 0; i<num; i++) {
        fill_n(visited[i], num, false);
    }


    for(int i = 0; i<num; i++) {
        for(int j = 0; j<num; j++) {
            int temp;
            scanf("%1d", &temp);
            apart[i][j] = temp;
        }
    }

    for(int i = 0; i<num; i++) {
        for(int j = 0; j<num; j++) {
            bool isFirst = true;
            countDanji(i, j, isFirst, count);
        }
    }

    int size = (int) count.size();
    cout<<size<<endl;

    sort(count.begin(), count.end());

    for(int i = 0; i<size; i++) {
        cout<<count[i]<<endl;
    }

    return 0;
}

BFS로 풀기

int num;
int apart[25][25];
int direction[4][2] = {
    {0, -1}, {1,0},
    {0, 1}, {-1, 0}
};

int danji[25][25];
int ans[25*25];

void bfs(int r, int c, int &cnt) {
    if(apart[r][c] == 0 || danji[r][c] != 0) {
        return;
    }
    queue <pair<int, int>> q;

    q.push(make_pair(r, c));
    cnt += 1;
    danji[r][c] = cnt;

    while(!q.empty()) {
        int row = q.front().first;
        int col = q.front().second;

        q.pop();

        for(int i = 0; i<4; i++) {
            int nextR = row + direction[i][0];
            int nextC = col + direction[i][1];

            if(nextR < num && nextR >= 0 && nextC < num && nextC >= 0 && apart[nextR][nextC] == 1 && danji[nextR][nextC] == 0) {
                q.push(make_pair(nextR, nextC));
                danji[nextR][nextC] = cnt;
            }
        }
    }
}

int main(int argc, const char * argv[]) {
    cin>>num;
    vector <int> count;
    cin.ignore();
    for(int i = 0; i<num; i++) {
        fill_n(visited[i], num, false);
    }


    for(int i = 0; i<num; i++) {
        for(int j = 0; j<num; j++) {
            int temp;
            scanf("%1d", &temp);
            apart[i][j] = temp;
        }
    }
    int cnt = 0;
    for(int i = 0; i<num; i++) {
        for(int j = 0; j<num; j++) {
            bfs(i, j, cnt);
        }
    }

    cout<<cnt<<endl;

    for(int i = 0; i<num; i++) {
        for(int j = 0; j<num; j++) {
            if(danji[i][j] != 0) {
                ans[danji[i][j]] += 1;
            }
        }
    }

    sort(ans + 1, ans + cnt + 1);

    for(int i = 1; i<=cnt; i++) {
        cout<<ans[i]<<endl;
    }

Last updated

Was this helpful?