본문 바로가기
개발 서적 리뷰/DoIt 알고리즘 코딩테스트

[DFS] 백준 11724번

by 거북이의 기술블로그 2024. 11. 15.

문제

방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오.
첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다.

 

문제분석

연결요소란, edge끼리 이어져있는 요소의 개수를 세라는 의미로서, DFS가 한번 끝난 횟수를 의미
(DFS 한번 끝난 경우 : 스택이 비어서 다음 edge값이 들어가기 전까지 )
DFS가 한번 끝날때까지의 count를 기록

 

예제 입력 예제 출력
6 5
1 2
2 5
5 1
3 4
4 6
2

 

 

DFS 핵심이론

  • 방문을 기록하여, 재방문없이 모든 노드를 탐색하는 알고리즘
    • 사각형 : 스택
    • 배열 :  방문 기록 ( T : 방문, F : 미방문)

 

 

구현

  • 재귀함수로 구현
  • 결과) (방문한곳은 skip)
    • 1->2->5 : DFS 1회 종료
    • 3->4->6 : DFS 2회 종료
import java.util.StringTokenizer;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class App {
    static ArrayList<Integer>[]arr;
    static boolean visited[];

    public static void main(String[] args) throws Exception {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(bf.readLine());

        int nodeSize = Integer.parseInt(st.nextToken());
        int edgeSize = Integer.parseInt(st.nextToken());

        arr = new ArrayList[nodeSize + 1];
        visited = new boolean[nodeSize + 1];

        for(int i =1; i< nodeSize + 1; i++){
            arr[i] = new ArrayList<Integer>();
        }

        for(int i =0; i< edgeSize; i++){
            st = new StringTokenizer(bf.readLine());
            int startNode = Integer.parseInt(st.nextToken());
            int endNode = Integer.parseInt(st.nextToken());
            arr[startNode].add(endNode);
            arr[endNode].add(startNode);
        }

        int count = 0;
        for(int i =1; i < nodeSize + 1; i++){
            if(!visited[i]){
                count++;
                dfs(i);
            }
        }
        System.out.println(count);
    }


    static void dfs(int v){
        if(visited[v]){
            return;
        }
        visited[v] = true;
        for(int i : arr[v]){
            if(visited[i] == false){
                dfs(i);
            }
        }
    }
}

'개발 서적 리뷰 > DoIt 알고리즘 코딩테스트' 카테고리의 다른 글

[DFS] 백준 13023번  (0) 2024.11.17
[DFS] 백준 2023번  (2) 2024.11.16
[기수정렬] 백준 10989번  (0) 2024.11.14
[병합 정렬] 백준 2751번  (0) 2024.11.12