[BOJ] 백준 2667 단지번호붙이기
이 문제는 그래프 문제의 일종으로, 아파트 단지처럼 1이 연속되어있는 부분이 몇개인지와, 몇개의 1들로 이루어져있는지 구하는 문제 입니다.
각 요소가 몇개의 요소로 이루어져있는지는 BFS or DFS를 이용하여 전부 순회하면서 카운팅 하면 되고, 그리고 연속되어있는 부분 덩이가 몇개인지는 맵을 하나하나 돌면서 방문 안한 지점이 나올때마다 1개씩 올려주면 되겠습니다.
소스코드 :
#include#include #include #include using namespace std; int N; bool visited[27][27]; vector< vector > v(27, vector (27, 0)); // 동서남북 방향으로 1칸씩 가기 위한 move 세팅 struct move { int y, x; }move[4] = { { -1,0 },{ 0,1 },{ 1,0 },{ 0,-1 } }; // 몇개 원소이며, 각 요소가 몇개 필요한지 저장할 벡터 vector counter; int cnt = 0; // DFS를 이용하여 갈수있는 모든곳을 가본다. void DFS(int y, int x) { visited[y][x] = true; for (int t = 0; t < 4; t++) { if (v[y + (::move[t].y)][x + (::move[t].x)] == 1 && visited[y + (::move[t].y)][x + (::move[t].x)] == false) { visited[y + (::move[t].y)][x + (::move[t].x)] = true; cnt++; DFS(y+::move[t].y , x +::move[t].x); } } } int main() { cin >> N; for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { scanf("%1d", &v[j][i]); } } for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { // 이번 장소가 한번도 안가봤는데 갈수 있는 길이면, if (visited[j][i] == false && v[j][i] == 1) { cnt++; DFS(j, i); counter.push_back(cnt); cnt = 0; } } } // 오름차순으로 정렬 후 출력 sort(counter.begin(), counter.end()); int size = counter.size(); cout << size << endl; for (int i = 0; i < size; i++) { cout << counter[i] << endl; } }
댓글
댓글 쓰기