728x90
반응형
1. 문제
https://www.acmicpc.net/problem/2667
2667번: 단지번호붙이기
<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수
www.acmicpc.net
2. 풀이
: 전형적인 flood fill 문제입니다. 주어진 2차원 배열을 탐색하며 1(아직 방문하지 않은 집)을 만나면 cnt를 증가시킨 후 상하좌우에 인접한 모든 집들을 dfs로 방문하면서 cnt+1값으로 채워줍니다. 이후 각 영역의 크기를 계산하고 오름차순으로 정렬하여 출력합니다. 이 문제에서 주의할 점은 입력을 받을 때, 띄어쓰기 없이 입력이 들어오므로 "%1d"를 이용해서 입력을 처리해줍니다.
3. 코드
#include <iostream>
#include <algorithm>
using namespace std;
int A[30][30], n, Size[400], cnt = 0;
int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, -1, 1};
void input() {
scanf("%d", &n);
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) scanf("%1d", &A[i][j]);
}
}
bool safe(int a, int b) {
return (0<=a && a<n) && (0<=b && b<n);
}
void dfs(int a, int b, int c) {
A[a][b] = c;
for(int i=0; i<4; i++) {
if(safe(a+dx[i], b+dy[i]) && A[a+dx[i]][b+dy[i]] == 1)
dfs(a+dx[i], b+dy[i], c);
}
}
void solve() {
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
if(A[i][j] == 1){
cnt++;
dfs(i, j, cnt+1);
}
}
}
for(int i=0; i<n; i++) {
for(int j=0; j<n; j++) {
if(A[i][j]) Size[A[i][j] - 2]++;
}
}
sort(Size, Size+cnt);
}
void output() {
printf("%d\n", cnt);
for(int i=0; i<cnt; i++) printf("%d\n", Size[i]);
}
int main(void) {
iostream::sync_with_stdio(false);
cin.tie(NULL);
input();
solve();
output();
return 0;
}
728x90
반응형
'💡 Problem Solving > Baekjoon' 카테고리의 다른 글
[백준 - 10819] 차이를 최대로 [c++] (0) | 2021.01.14 |
---|---|
[백준 - 11724] 연결 요소의 개수 [C++] (1) | 2020.04.20 |
[백준 - 11403] 경로찾기 [C++] (1) | 2020.04.20 |
[백준 - 1012] 유기농 배추 [C++] (2) | 2020.04.17 |
[백준 - 1260] DFS와 BFS [C++] (1) | 2020.04.17 |