BOJ

백준 2667 - 단지번호붙이기

yanJuicy 2019. 8. 29. 22:54
반응형

문제

 

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

 

2667번: 단지번호붙이기

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

www.acmicpc.net

 

 

풀이

 

DFS의 개념을 이용하면 간단하게 풀 수 있는 문제이다. 2차원 배열을 이용해서 그래프를 만든 후 2차원 배열에서 값이 1인 지점을 기준으로 DFS 탐색을 진행하면 된다. 탐색 방향은 상하좌우로 설정해주면 된다. DFS 탐색을 실행한 좌표 값은 0으로 만들어 재방문을 막는다.

 

그리고 단지의 크기를 알기 위해 sum 변수를 설정 했는데, DFS 탐색을 실행할때마다 sum 값을 증가시켜주면 한 개 단지의 크기를 알 수 있다.

 

1. 이중 for 문에서 1인 좌표에서 DFS 탐색을 실행한다

2, sum 값을 증가시키고 DFS 탐색을 실행한 좌표는 0으로 바꿔준다. (재방문을 막음)

3. 방문 좌표에서 상하좌우로 1인 좌표가 있다면 DFS 탐색을 실행한다.

4. DFS 탐색이 끝나면 sum 값을 저장하고 0으로 바꿔준다. (다음 단지의 크기를 알기 위해)

5. 이중 for 문이 끝날 때까지 1, 2, 3, 4 반복

 

 

코드

 

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
#include <iostream>
#include <string>
#include <algorithm>
 
using namespace std;
 
string input[25];
int N, sum;
int graph[27][27];
int result[25];
int index;
 
void dfs(int i, int j)
{
    graph[i][j] = 0;
    sum++;
 
    if (graph[i - 1][j]) dfs(i - 1, j);
    if (graph[i + 1][j]) dfs(i + 1, j);
    if (graph[i][j - 1]) dfs(i, j - 1);
    if (graph[i][j + 1]) dfs(i, j + 1);
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
        
    cin >> N;
 
    for (int i = 0; i < N; i++cin >> input[i];
    
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            graph[i][j] = input[i - 1][j - 1- '0';
 
    for (int i = 1; i <= N; i++)
        for (int j = 1; j <= N; j++)
            if (graph[i][j])
            {
                sum = 0;
                dfs(i, j);
                result[index++= sum;
            }
 
    sort(result, result + index);
    
    cout << index << '\n';
    for (int i = 0; i < index; i++)
        cout << result[i] << '\n';
    
    return 0;
}
 
cs
반응형

'BOJ' 카테고리의 다른 글

백준 2011 - 암호코드  (0) 2019.09.14
백준 4963 - 섬의 개수  (0) 2019.09.02
백준 11653 - 소인수분해  (0) 2019.08.23
백준 2745 - 진법 변환  (0) 2019.08.22
백준 11657 - 타임머신  (0) 2019.08.21