Algorithm/백준

[BOJ] - 2667. 단지번호붙이기

benguin 2019. 4. 9. 21:58

[URL]

https://www.acmicpc.net/problem/2667

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수

www.acmicpc.net

[풀이 과정]

 

*단순 재귀DFS

 

1. map[][] == 1인 곳 vector v에 push

2. v만큼 for문 돌며 재귀 dfs()

3. 첫번째 단지 발견시 check[][]을 cnt (2)로 채워준다.

   두번째 단지 발견지 check[][]을 cnt+1(3)으로 채워준다.

 

4. check배열 검사하며 갯수 카운팅

5. cand[]배열에 넣고 sort

6. 오름차순 정렬 된 cand[]배열 출력

 

[소스 코드]

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <stdio.h>
#include <algorithm>
using namespace std;
 
int N;        // 5이상 25이하
int map[26][26];
int check[26][26];
 
int dx[] = { 00-11 };
int dy[] = { -1100 };
 
int cand[1000];
 
void DFS(int cx, int cy, int val) {
 
    check[cx][cy] = val;
 
    for (int k = 0; k < 4; k++)
    {
        int nx = cx + dx[k];
        int ny = cy + dy[k];
 
        if (nx >= 0 && ny >= 0 && nx < N && ny < N)
        {
            if (map[nx][ny] == 1 && check[nx][ny] == 0)
            {
                DFS(nx, ny, val);
            }
        }
    }
}
 
int main() {
    scanf("%d"&N);
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            scanf("%1d"&map[i][j]);
        }
    }
 
    int groupCnt = 0;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            if (map[i][j] == 1 && check[i][j] == 0)
            {
                groupCnt++;
                DFS(i, j, groupCnt);
            }
        }
    }
 
    for (int k = 1; k <= groupCnt; k++)
    {
        int tempSum = 0;
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                if (check[i][j] == k)
                {
                    tempSum++;
                }
            }
        }
        cand[k - 1= tempSum;
    }
 
    sort(cand, cand + groupCnt);
    printf("%d\n", groupCnt);
    for (int k = 0; k < groupCnt; k++)
    {
        printf("%d\n", cand[k]);
    }
 
    return 0;
}
cs

'Algorithm > 백준' 카테고리의 다른 글

[BOJ] - 14500. 테트로미노  (0) 2019.04.11
[BOJ] 14502. 연구소  (0) 2019.04.10
[BOJ] - 14888. 연산자 끼워넣기  (0) 2019.04.09
[BOJ] - 14889. 스타트와 링크  (0) 2019.04.09
[BOJ] - 17136. 색종이 붙이기  (0) 2019.04.09