문제 출처: https://www.acmicpc.net/problem/2667



참고

BFS(Breadth-First Search): http://qlyh8.tistory.com/30?category=731166

BFS 문제: http://qlyh8.tistory.com/31?category=731166


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
81
82
83
84
85
86
87
88
89
90
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
 
public class Main {
    private static int N, count = 1;
    private static int[][] map;
    private static int[] dirX = {010-1};
    private static int[] dirY = {10-10};
 
    public static void main(String[] args) throws Exception {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(reader.readLine());
        map = new int[N][N];
 
        for(int i=; i<N ; i++){
            String input = reader.readLine();
           for(int j=; j<N ; j++){
               map[i][j] = input.charAt(j) - '0';
           }
        }
 
        for(int i=; i<N ; i++){
            for(int j=; j<N ; j++){
                if(map[i][j] == 1){ // 집이 있는 경우 탐색
                    bfs(new Position(i, j, ++count)); // 단지 번호가 2부터 시작 (1이랑 중복되면 안됨)
                }
            }
        }
 
        int[] danji = new int[count-1]; // 총 단지 수가 danji 배열의 총 크기
        for(int i=; i<N ; i++){
            for(int j=; j<N ; j++){
                if(map[i][j] > 1){ // 번호가 매겨진 단지
                    danji[map[i][j]-2]++// 각 단지 내 집 수 계산
                }
            }
        }
 
        Arrays.sort(danji); // 오름차순 정렬
 
        StringBuilder builder = new StringBuilder();
        builder.append(count-1).append("\n");
        for (int aDanji : danji) {
            builder.append(aDanji).append("\n");
        }
 
        System.out.println(builder);
    }
 
    private static void bfs(Position position){
        Queue<Position> queue = new LinkedList<>();
        queue.offer(position);
 
        while(!queue.isEmpty()){
            Position front = queue.poll();
            map[front.getY()][front.getX()] = front.getCount(); // 단지 번호 갱신
 
            for(int i=; i<; i++){ // 집이 있는 곳의 주변 4방향 탐색
                int newY = front.getY() + dirY[i];
                int newX = front.getX() + dirX[i];
 
                if((<= newY && newY < N) && (<= newX && newX < N)){ // 지도 범위 내
                    if(map[newY][newX] == 1){ // 집이 있는 곳이면
                        map[newY][newX] = front.getCount(); // 단지 번호 갱신
                        queue.offer(new Position(newY, newX, front.getCount())); // 큐에 넣음
                    }
                }
            }
        }
    }
 
    public static class Position{
        int y, x, count;
 
        Position(int y, int x, int count) {
            this.y = y;
            this.x = x;
            this.count = count;
        }
 
        int getY(){return y;}
 
        int getX(){return x;}
 
        int getCount(){return count;}
    }
}
cs


'Algorithm' 카테고리의 다른 글

백준 2748번: 피보나치 수 2  (0) 2018.10.31
백준 2747번: 피보나치 수  (0) 2018.10.31
백준 2606번: 바이러스  (0) 2018.10.26
백준 2178번: 미로 탐색  (0) 2018.10.26
백준 7569번: 토마토  (0) 2018.10.26

+ Recent posts