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

황승환·2021년 7월 21일
0

C++

목록 보기
21/65

이번 문제는 DFS 알고리즘을 활용하여 해결하는 문제였다.
DFS & BFS

  • 입력에 띄어쓰기가 없으므로 string 형으로 입력 받은 뒤에 2차배열에 넣어준다.
  • 그래프의 이동은 dy, dx 배열을 통해 구현한다.
  • DFS 안에서 그래프 범위 내의 방문하지 않은 값이 1인 인덱스에 도착하면 DFS를 재귀적으로 호출한다.
  • 방문처리를 반드시 해준다.

Code

#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <algorithm>
#define MAX 26
using namespace std;

int n;
string a;
int graph[MAX][MAX];
bool visited[MAX][MAX];
int dy[4]={0,1,0,-1};
int dx[4]={1,0,-1,0};
int cnt=0;
vector<int> result;

void Input(){
    cin>>n;
    for(int i=0; i<n; i++){
        cin>>a;
        for(int j=0; j<n; j++){
            graph[i][j]=a[j]-'0';
        }
    }
}

void DFS(int y, int x){
    cnt++;
    visited[y][x]=true;
    for(int i=0; i<4; i++){
        int ny=dy[i]+y;
        int nx=dx[i]+x;
        if((ny>=0&&nx>=0&&ny<n&&nx<n)&&graph[ny][nx]==1&&!visited[ny][nx]){
            DFS(ny,nx);
        }
    }
}

void Solution(){
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            if(graph[i][j]==1&&!visited[i][j]){
                cnt=0;
                DFS(i, j);
                result.push_back(cnt);
            }
        }
    }
    sort(result.begin(), result.end());
    cout<<result.size()<<endl;
    for(int i=0; i<result.size(); i++){
        cout<<result[i]<<endl;
    }
}



int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    Input();
    Solution();
    return 0;
}

profile
꾸준함을 꿈꾸는 SW 전공 학부생의 개발 일기

0개의 댓글