[백준 20040] 사이클 게임(Java)

최민길(Gale)·2023년 8월 28일
1

알고리즘

목록 보기
117/172

문제 링크 : https://www.acmicpc.net/problem/20040

이 문제는 유니온 파인드를 이용하여 풀 수 있습니다. 유니온 파인드 알고리즘 특성상 사이클 유무를 파악할 수 있기 때문에 유니온 파인드로 각 노드들을 병합하여 사이클이 완성될 때의 반복문 루프 횟수를 출력합니다.

코드는 아래와 같습니다.

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

class Main{
    static int N,M,res=0;
    static int[] parent;

    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        parent = new int[N];
        for(int i=0;i<N;i++) parent[i] = i;

        for(int i=0;i<M;i++){
            st = new StringTokenizer(br.readLine());
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            union(a,b,i+1);
            if(res != 0) break;
        }

        System.out.println(res);
    }

    static void union(int a, int b, int idx){
        a = find(a);
        b = find(b);
        if(a != b) parent[b] = a;
        else res = idx;
    }

    static int find(int a){
        if(a == parent[a]) return a;
        else return parent[a] = find(parent[a]);
    }
}

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글

관련 채용 정보