문제 풀이 및 개발 공간

[백준] 20955번 민서의 응급 수술 (gold 4 본문

백준공부/java

[백준] 20955번 민서의 응급 수술 (gold 4

gomduri43 2024. 3. 15. 11:36

import java.io.*;
import java.util.*;

public class Main{
    static int[] num;
    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st=new StringTokenizer(br.readLine());
        int n=Integer.valueOf(st.nextToken());
        int m=Integer.valueOf(st.nextToken());
        num=new int[n+1];
        for(int i=1; i<=n; i++){
            num[i]=i;
        }

        int answer=0;
        for(int i=0; i<m; i++){
            st=new StringTokenizer(br.readLine());
            int a=Integer.valueOf(st.nextToken());
            int b=Integer.valueOf(st.nextToken());

            int fa=Find(a);
            int fb=Find(b);
            //이미 연결된 경우
            //또 연결하면 사이클 발생 하므로 끊기
            if(fa==fb){
                answer++;
                continue;
            }
            //연결되어 있다고 하니 제시문 대로 연결
            else{
                Union(a,b);
            }
        }
        boolean[] visit=new boolean[n+1];
        //각 점들의 대표 수를 확인.
        //등록 안되어있으면 등록, 대표 수가 다르다는 건 다른 집합에 속한다는 의미
        //다른 집합에 속하는 경우마다 +1;
        //이때 기준이 되는 집합이 있다고 할 때 그 대표수를 체크하려고 +1 된 상태이므로
        //마지막 답에서 -1을 해줘야함.
        for(int i=1; i<=n; i++){
            int temp=Find(i);
            if(!visit[temp]){
                visit[temp]=true;
                answer++;
            }
        }

        bw.write(answer-1+"");
        bw.flush();
    }

    public static int Find(int v){
        if(v==num[v]){
            return v;
        }
        else{
            return num[v]=Find(num[v]);
        }
    }

    public static void Union(int a, int b){
        int fa=Find(a);
        int fb=Find(b);
        if(fa!=fb){
            num[fa]=fb;
        }
    }
}