Problem Solving/BOJ

[백준 2583번] [DFS] 영역 구하기

  • -
728x90
반응형

Approach

사실상 이 문제와 거의 동일하다.

https://viyoung.tistory.com/317

 

[백준 1012번] [DFS / BFS] 유기농 배추

Approach 연결 요소(Component)의 개수를 묻는 문제이다. 배추가 심어져 있는 곳에 대해서 방문하지 않았다면 DFS / BFS를 돌리고 component의 개수를 1 증가시켜 주면 된다. Code #include #define fastio ios_b..

viyoung.tistory.com

단, 유기농 배추 문제와 달리 이동할 수 있는 노드를 직접적으로 제시하지 않고 이동할 수 없는 노드들을 제시했다는 점에서만 차이가 존재한다. 근본적인 접근 방법은 완전히 동일하다고 할 수 있다.

 

결과적으로 Component 개수를 물어보는 문제라고 이해하면 된다.

Code

#include <bits/stdc++.h>
#define fastio ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0)

using namespace std;
typedef pair<int, int> pii;

int m, n, k; // m : y, n; x
int r[101][101];
int visited[101][101];
vector<pii> v;

int move_x[4] = {-1, 1, 0, 0};
int move_y[4] = {0, 0, -1, 1};

int dfs(int x, int y){
    visited[x][y] = 1;
    int component_num = 0;
    for(int i = 0; i < 4; i++){
        int dx = x + move_x[i];
        int dy = y + move_y[i];
        if(dx < 0 || dx >= n || dy < 0 || dy >= m) continue;
        if(!visited[dx][dy] && r[dx][dy] == 0) component_num += dfs(dx, dy);
    }
    return component_num + 1;
}

int main(void){
    fastio;
    memset(r, 0, sizeof(r));
    memset(visited, 0, sizeof(visited));
    cin >> m >> n >> k;

    for(int i = 0; i < k; i++){
        int s_x, s_y, e_x, e_y;
        cin >> s_x >> s_y >> e_x >> e_y;
        for(int j = s_x; j < e_x; j++){
            for(int k = s_y; k < e_y; k++){
                r[j][k] = 1;
            }
        }
    }

    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(!r[i][j]) v.push_back(make_pair(i, j));
        }
    }

    vector<int> component_store;

    for(int i = 0; i < v.size(); i++){
        int x = v[i].first;
        int y = v[i].second;
        if(!visited[x][y]) component_store.push_back(dfs(x, y));
    }
    
    sort(component_store.begin(), component_store.end());

    cout << component_store.size() << "\n";

    for(int i = 0; i < component_store.size(); i++){
        cout << component_store[i] << " ";
    }
    cout << "\n";
    return 0;
}
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.