본문 바로가기
Coding Test/백준 알고리즘 풀이

[백준] 11724 연결 요소의 개수 (자바) : BFS / DFS

by CSEGR 2024. 7. 15.
728x90
문제 설명 

문제

방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.

출력

첫째 줄에 연결 요소의 개수를 출력한다.

예제 입력 1 

6 5
1 2
2 5
5 1
3 4
4 6

예제 출력 1 

2

예제 입력 2 

6 8
1 2
2 5
5 1
3 4
4 6
5 4
2 4
2 3

예제 출력 2 

1

 

결과

위에 결과는 DFS, 아래 결과는 BFS 풀이 입니다. 

결론적으로 이 문제에서는 메모리와 시간적 측면에서 DFS 및 BFS 알고리즘 성능 차이가 없었습니다 .

BFS 풀이 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main{
    static int n, m;

    static int[][] map;
    static boolean[] visited;

    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());

        map = new int[n+1][n+1];
        visited = 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());
            map[a][b] = map[b][a] = 1;
        }
        bfs();
    }

    public static void bfs(){
        Queue<Integer> q = new LinkedList<>();
        int cnt = 0;
        for(int i = 1; i<n+1; i++){
            if(!visited[i]){
                q.add(i);
                while(!q.isEmpty()){
                    int current = q.poll();
                    for(int j = 1; j< n+1; j++){
                        if(map[current][j] == 1 && !visited[j]){
                            q.add(j);
                            visited[j] = true;
                        }
                    }
                }
                cnt ++;
            }
            else continue;
        }

        System.out.println(cnt);

    }
}

 

 

 

DFS 풀이 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main{
    static int n, m;

    static int[][] map;
    static boolean[] visited;

    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());

        map = new int[n+1][n+1];
        visited = 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());
            map[a][b] = map[b][a] = 1;
        }
        int cnt = 0 ;
        for(int i = 1; i< n+1; i++){
            if(!visited[i]) {
                dfs(i);
                cnt ++;
            }
        }
        System.out.println(cnt);

    }

    public static void dfs(int start){
        for(int j = 1; j<n+1; j++){
            if(map[start][j] ==1 & !visited[j])
            {
                visited[j] = true;
                dfs(j);
            }
        }
    }
}
728x90