반응형
https://www.acmicpc.net/problem/2667
C++로 작성한 백준 문제 2667번 단지번호 붙이기에 대한 문제 풀이다.
실버 1 문제로 그래프 이론, 그래프 탐색, 깊이 우선 탐색, 너비 우선 탐색이 문제를 푸는데 필요한 주요 지식이다.
문제 설명
문제
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.
입력
첫 번째 줄에는 지도의 크기 N(정사각형이므로 가로와 세로의 크기는 같으며 5≤N≤25)이 입력되고, 그다음 N 줄에는 각각 N개의 자료(0 혹은 1)가 입력된다.
출력
첫 번째 줄에는 총 단지수를 출력하시오. 그리고 각 단지내 집의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오.
문제 파악하기
- 주어진 데이터를 BFS 나 DFS로 계속 탐색한다.
- 2차원 배열이므로, 가로나 세로 인덱스가 같다면 인접한 것으로 처리한다.
- BFS나 DFS를 시행할 때 단지내 집의 수를 출력하기 위해, 확인한 단지 수를 카운팅 해준다.
- 총 단지수를 출력하기 위해 탐색을 모두 마칠 때마다 카운팅 해준다.
코드 및 설명
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
int n,cnt=0;
vector<int> v;
int arr[26][26];
bool visited[26][26]={false};
void dfs(int i,int j){
if(j>0){
if(arr[i][j-1]==1 && !visited[i][j-1]){
visited[i][j-1]=true;
cnt++;
dfs(i,j-1);
}
}
if(j<n-1){
if(arr[i][j+1]==1 && !visited[i][j+1]){
visited[i][j+1]=true;
cnt++;
dfs(i,j+1);
}
}
if(i>0){
if(arr[i-1][j]==1 && !visited[i-1][j]){
visited[i-1][j]=true;
cnt++;
dfs(i-1,j);
}
}
if(i<n-1){
if(arr[i+1][j]==1 && !visited[i+1][j]){
visited[i+1][j]=true;
cnt++;
dfs(i+1,j);
}
}
}
int main(){
scanf("%d",&n);
for(int i=0; i<n;i++){
for(int j=0; j<n; j++){
scanf("%1d",&arr[i][j]);
}
}
for(int i=0; i<n;i++){
for(int j=0; j<n; j++){
if(arr[i][j]==1 && !visited[i][j]){
visited[i][j]=true;
cnt++;
dfs(i,j);
v.push_back(cnt);
cnt=0;
}
}
}
sort(v.begin(),v.end());
cout<<v.size()<<'\n';
for(int i=0; i<v.size();i++){
cout<<v[i]<<'\n';
}
}
- for문으로 주어진 모든 데이터를 확인한다. 0이거나 이미 방문한 곳이라면 넘어간다. 자연수면서 아직 방문한 곳이 아니라면 DFS 함수를 실행시켜 확인한다.
헤매었던 부분
- DFS 함수 안에서 변수명 2개를 착각해서 틀렸었다.
- 변수명을 귀찮다고 대충 짓지 말고 확실히 짓는 습관을 들여야 될 것 같다.
마무리
쉬운 DFS, BFS 문제였다.
반응형
'algorithm > BFS,DFS' 카테고리의 다른 글
[백준] 7576번: 토마토 풀이 및 해설(C++) (0) | 2024.01.19 |
---|---|
[백준] 1697번: 숨바꼭질 풀이 및 해설(C++) (0) | 2024.01.18 |
[백준] 24445번: 알고리즘 수업 - 너비 우선 탐색 2 풀이 및 해설(C++) (0) | 2024.01.16 |
[백준] 24444번: 알고리즘 수업 - 너비 우선 탐색1 풀이 및 해설(C++) (0) | 2024.01.16 |
[백준] 1260번: DFS와 BFS 풀이 및 해설(C++) (1) | 2024.01.16 |