Algorithm/graph

[백준] 알고리즘 2667번 - 단지번호붙이기 문제

낭강 2021. 1. 26. 01:46

#include <bits/stdc++.h>
using namespace std;
char check[26][26];
int n;
int cnt = 0;
bool dfs(int x,int y) {
    if (x  < 0 || x  > n || y  < 0 || y  > n)
        return 0;
    if (check[x][y]-'0' == 1) {
        check[x][y] = 2;
        cnt += 1;
        dfs(x - 1, y);
        dfs(x + 1, y);
        dfs(x, y - 1);
        dfs(x, y + 1);
        return true;
    }
    return false;
}
int main(){
    int ans = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            cin >> check[i][j];
        }
    }
    vector<int> v1;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (dfs(i, j)) {
                v1.push_back(cnt);
                cnt = 0;
            }
        }
    }
    sort(v1.begin(), v1.end());
    cout << v1.size()<<"\n";
    for (int i = 0; i < v1.size(); i++) {
        cout << v1[i]<<"\n";
    }
}

dfs를 이용하여 한 단지의 블록수를 출력 해주는 문제이다.

이런 문제가 나오면 상 하 좌 우 이동한다하면 저렇게 좌표를 검색하여 dfs를 사용하여 문제를 해결 할 수 있다.