(백준 알고리즘 문제풀이) 2667번 단지번호붙이기
by 줌코딩
문제
어떻게 접근할 것인가?
- 1이 있는 곳을 큐에 넣어주고 bfs를 진행한다.
- bfs해서 4방향 중에 1이 있는 곳을 큐에 넣어주고 해당 위치를 0으로 바꿔준다.
- 이때 매번 count를 증가시킨다.
- bfs가 끝나는 결과 값을 벡터에 넣고 솔팅한다.
코드
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
vector<vector<int> > v;
queue<pair<int, int> > q;
int d[4][2] = { {1,0}, {-1,0}, {0,1}, {0,-1} };
int bfs(int x, int y){
int c = 1;
v[x][y] = 0;
q.push(make_pair(x, y));
while(!q.empty()){
pair<int, int> temp = q.front(); q.pop();
for(int i = 0; i < 4; i++){
int X = temp.first + d[i][0], Y = temp.second + d[i][1];
if(v[X][Y]){
v[X][Y] = 0;
q.push(make_pair(X, Y));
c ++;
}
}
}
return c;
}
int main(){
int n;
scanf("%d ", &n);
vector<int> answer;
v = vector<vector<int> >(n + 2);
for(int i = 0; i < n + 2; i++){
v[i] = vector<int>(n + 2);
if(i == 0 || i == n + 1) continue;
for(int j = 1; j < n + 1; j++){
char temp;
scanf("%c", &temp);
v[i][j]= temp - '0';
}
getchar();
}
for(int i = 0; i < n + 2; i++){
for(int j = 1; j < n + 2; j++){
if(v[i][j])answer.push_back(bfs(i, j));
}
}
sort(answer.begin(), answer.end());
printf("%lu\n", answer.size());
for(int i = 0; i < answer.size(); i++)printf("%d\n", answer[i]);
}
느낀점
- BFS로 수월하게 패스
- 인풋에 공백 없는거 에바임…
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
Subscribe via RSS