Algorithm/JAVA - BOJ

백준/BOJ - 2667 단지번호붙이기 JAVA

ㅇㅇ잉 2021. 8. 17. 22:15

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

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

 

일단 배열로 입력 받는다.

그리고 배열을 돌면서 visit배열을 확인하여 아직 방문하지 않았으면 방문해서, 인접해있는 배열들을 전부 방문하면서 연결된 집을 센다.

좌우,위아래 연결되어있는 집을 찾는거니까 각 연결된 집을 어떤식으로 찾을지 고민해야하는데

각각 (x,y)라고 하고 현재 위치가 (0,0)에 있다고 가정하면

  (0,1)  
(-1,0) (0,0) (1,0)
  (0,-1)  

왼쪽 오른쪽 위 아래 좌표는 각각 저런식으로 될 것이다.

저걸 배열에 각각 저장해주는거다!

아래 코드에서는 11~12줄에 해당한다.

 

dfs는 상하좌우 좌표를 돌면서, 다음 좌표가 범위 내에 있는지 확인하고 범위 내에 있고, 방문하지 않았고, 집이 있으면 방문한다.

이런식으로 방문하면 끝!

 

1. DFS

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
public class Main {
 
    static int[][] arr;
    static boolean[][] visit;
    static int N;
    static int[] dx = {-1,1,0,0}; //좌,우,위,아래
    static int[] dy = {0,0,1,-1};
    static LinkedList<Integer> res = new LinkedList<>();
    static int cnt =0;
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
 
        N = Integer.parseInt(br.readLine());
        arr = new int[N][N];
        visit = new boolean[N][N];
 
        for(int i=0;i<N;i++){
            String str = br.readLine();
            for(int j=0;j<N;j++){
                arr[i][j]=str.charAt(j)-'0';
            }
        }
 
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                if(!visit[i][j] && arr[i][j]==1){
                    dfs(i,j);
                    res.add(cnt);
                    cnt=0;
                }
            }
        }
 
        sb.append(res.size()+"\n");
        Collections.sort(res);
 
        for(int i=0;i<res.size();i++){
            sb.append(res.get(i)+"\n");
        }
        System.out.print(sb);
    }
 
    public static void dfs(int x, int y){
        visit[x][y]=true;
        cnt++;
 
        for(int i=0;i<4;i++){
            int nxtx = x+dx[i];
            int nxty = y+dy[i];
 
            if(nxtx>=|| nxtx<0 || nxty>=|| nxty<0continue;
            if(arr[nxtx][nxty]==1 && visit[nxtx][nxty]==false)
                dfs(nxtx,nxty);
        }
    }
}
cs

 

 

 

 

이건 BFS방식으로 풀어본거

 

2. BFS

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
import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
public class Main {
 
    static int N;
    static int[][] arr;
    static boolean[][] visit;
    static int[] dx = {0,0,-1,1}; //상하좌우
    static int[] dy = {1,-1,0,0};
    static int cnt=0;
    static LinkedList<Integer> res = new LinkedList<>();
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
 
        N = Integer.parseInt(br.readLine());
 
        arr = new int[N][N];
        visit = new boolean[N][N];
 
        for(int i=0;i<N;i++){
            String str = br.readLine();
            for(int j=0;j<N;j++){
                arr[i][j]=str.charAt(j)-'0';
            }
        }
 
        for(int i=0;i<N;i++){
            for(int j=0;j<N;j++){
                if(!visit[i][j] && arr[i][j]==1){
                    bfs(i,j);
                    res.add(cnt);
                    cnt=0;
                }
            }
        }
 
        Collections.sort(res);
 
        sb.append(res.size()).append("\n");
        for(int val : res){
            sb.append(val).append("\n");
        }
        System.out.print(sb);
    }
 
    static void bfs(int x, int y){
        Queue<Point> q = new LinkedList<>();
        q.add(new Point(x,y));
        cnt++;
 
        while(!q.isEmpty()){
            Point cur = q.poll();
            visit[cur.x][cur.y]=true;
 
            for(int i=0;i<4;i++){
                int nxtx = cur.x+dx[i];
                int nxty = cur.y+dy[i];
 
                if(nxtx<0 || nxtx>=|| nxty<0 || nxty>=N) continue;
                if(!visit[nxtx][nxty] && arr[nxtx][nxty]==1) {
                    q.add(new Point(nxtx, nxty));
                    visit[nxtx][nxty]=true;
                    cnt++;
                }
            }
 
        }
    }
}
cs