[백준] 24391: 귀찮은 해강이 - JAVA

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

풀이

건물을 돌아다닐 때, 서로 연결되어있는 건물은 밖으로 안나가고 이동할 수 있다.

몇 번 밖으로 나와야하는지 구해야한다.

서로 연결된 건물들을 union메서드를 이용해 한 parent로 묶었다.

그렇게해서 i번 건물과 i-1번 건물이 parent가 다르다면 answer을 1증가시켰다.


메모리: 52100KB

시간: 456ms

언어: Java 11

코드

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

public class Main {
    static int[] parent;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        parent = new int[n + 1];
        for (int i = 1; i < n + 1; 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);
        }

        int answer = 0;
        int[] lecture = new int[n];

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++) {
            lecture[i] = Integer.parseInt(st.nextToken());
            if (i > 0 && find(lecture[i]) != find(lecture[i - 1])) {
                answer++;
            }
        }

        System.out.println(answer);
    }

    private static void union(int a, int b) {
        int pa = find(a);
        int pb = find(b);

        if (pa > pb) {
            parent[pb] = pa;
        } else {
            parent[pa] = pb;
        }
    }

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

}