✏️ Algorithm/알고리즘 풀이

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

미미누 2022. 8. 10. 00:21

✅[문제/Problem]
https://www.acmicpc.net/problem/2667

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net


✅[풀이/Explanation]

BFS 문제이다. 단순히 for 문을 돌려 1일때 큐에 좌표값을 넣고, BFS를 돌려 넓이 값을 벡터에 넣어주면 된다. 주의할 점은 입력을 받을때 숫자가 띄어져 있지 않으므로, 문자열에 입력받아야 한다. 이것이 은근 헷갈린다. 마지막으로인자를 넣은 벡터의 사이즈와 배열 값을 출력한다.

The solving method is to use BFS. iterate FOR structure, when a number in string arrays is one then By BFS we put areas into a vector container. points of notice are that when input numbers, numbers are stuck together, so we should input them into a string array. It is to be confused. in sum, we can solve a problem easily by outputting a vector's size and numbers in a vector.


✅[code]

#include <bits/stdc++.h>

using namespace std;

#define X first

#define Y second

string arr[40];

bool vis[40][40];

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

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

int main() {

    ios::sync_with_stdio(0);

    cin.tie(0);

    

    int N;

    cin >> N;

    for(int i=0; i<N; i++){

        cin >> arr[i];

    }

    

    vector <int> v;

    int tmp = 0;

    for(int i=0; i<N; i++){

        for(int j=0; j<N; j++){

            queue<pair<int,int>> q;

            if(arr[i][j] == '1' && vis[i][j] == 0){

                q.push({i,j});

                vis[i][j] = 1;

                tmp++;

            }

            while(!q.empty()){

                auto t = q.front(); q.pop();

                for(int i=0; i<4; i++){

                    int x = t.X + dx[i];

                    int y = t.Y + dy[i];

                    if(x<0 || x>=N || y<0 || y>= N) continue;

                    if(arr[x][y] != '1' || vis[x][y] == 1) continue;

                    vis[x][y] = 1;

                    tmp++;

                    q.push({x,y});

                }

            }

            if(tmp > 0) v.push_back(tmp);

            tmp = 0;

        }

    }

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

    cout << v.size() << '\n';

    for(int i=0; i<v.size(); i++){

      cout << v[i] << '\n';

    }

}

'✏️ Algorithm > 알고리즘 풀이' 카테고리의 다른 글

[BOJ 15649] N과 M(1) - C++  (2) 2022.08.11
[BOJ 2448] 별 찍기 - C++  (0) 2022.08.11
[BOJ 2630] 색종이 만들기 - C++  (0) 2022.08.09
2583번 영역구하기 - C++  (0) 2022.08.04
1627번 곱셈 - C++  (0) 2022.08.04