Algorithm/JAVA - BOJ

백준/BOJ - 1260 DFS와 BFS JAVA

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

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

 

1260번: DFS와 BFS

첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사

www.acmicpc.net

 

 

 

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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
public class Main {
 
    static int N,M,V;
    static int [][] arr;
    static boolean [] visit;
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        StringTokenizer st = new StringTokenizer(br.readLine());
        N=Integer.parseInt(st.nextToken());
        M=Integer.parseInt(st.nextToken());
        V=Integer.parseInt(st.nextToken());
 
        arr = new int[N+1][N+1];
        visit = new boolean[N+1];
 
        for(int i=0;i<M;i++){
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
 
            arr[a][b]=1;
            arr[b][a]=1;
        }
 
 
        dfs(V);
        sb.append("\n");
        Arrays.fill(visit,false);
        
        bfs();
        System.out.println(sb);
    }
    public static void dfs(int v){
        visit[v]=true;
        sb.append(v+" ");
 
 
        for(int i=1;i<arr[v].length;i++){
            if(!visit[i] && arr[v][i]==1){
                dfs(i);
            }
        }
    }
cs

배열을 돌면서 방문하지 않았고, 서로 연결되어있으면 dfs로 탐색을 한다.

35줄 Arrays.fill(visit,false); 는 방문 배열을 초기화하기 위한 것이다.

출력시간을 줄이기 위해 BufferedReader와 StringBuilder를 사용했다.

 

 

 

 

2. 인접리스트로 푼 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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
public class Main {
 
    static int N,M,V;
    static ArrayList<Integer>[] arr;
    static boolean [] visit;
    static StringBuilder sb = new StringBuilder();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 
        StringTokenizer st = new StringTokenizer(br.readLine());
        N=Integer.parseInt(st.nextToken());
        M=Integer.parseInt(st.nextToken());
        V=Integer.parseInt(st.nextToken());
 
        arr = new ArrayList[N+1];
        visit = new boolean[N+1];
 
        for(int i=1;i<=N;i++){
            //리스트 만들어 배열에 넣음
            arr[i]=new ArrayList<>();
        }
 
        for(int i=0;i<M;i++){
            st = new StringTokenizer(br.readLine());
 
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
 
            arr[a].add(b);
            arr[b].add(a);
        }
 
        for(int i=1;i<=N;i++){
            Collections.sort(arr[i]);
        }
 
        dfs(V);
        sb.append("\n");
        Arrays.fill(visit,false);
        bfs();
        System.out.println(sb);
 
    }
 
    public static void dfs(int v){
        visit[v]=true;
        sb.append(v+ " ");
 
        for(int i=0;i<arr[v].size();i++){
            int cur = arr[v].get(i);
            if(!visit[cur])
                dfs(cur);
        }
    }
 
    public static void bfs(){
        Queue<Integer> q = new LinkedList<Integer>();
        q.add(V);
 
        while(!q.isEmpty()){
            int cur = q.poll();
            visit[cur]=true;
            sb.append(cur+ " ");
 
            for(int i=0;i<arr[cur].size();i++){
                int nxt = arr[cur].get(i);
                if(!visit[nxt]){
                    q.add(nxt);
                    visit[nxt]=true;
                }
            }
        }
    }
}
 
cs

인접리스트 방식으로 풀면 배열에선 진행하지 않았던 작업을 더 해줘야하는데,

하나는 23줄이다. 리스트를 만들어서 배열에 넣는 작업,

또 하나는 38줄 작업인데 아까는 배열을 차례로 방문하니까 정렬 작업이 필요 없었는데

이건 인접리스트 방법이라서 정렬을 한번 해주어야 한다.

 

그리고 bfs를 구현할때는 Queue를 이용해서 구현해준다.