๊ธฐ๋ก๋ฐฉ

BOJ_1717 : ์ง‘ํ•ฉ์˜ ํ‘œํ˜„ ๋ณธ๋ฌธ

CodingTest/Java

BOJ_1717 : ์ง‘ํ•ฉ์˜ ํ‘œํ˜„

Soom_1n 2023. 3. 8. 12:52

๐Ÿ‘‰ ๋ฌธ์ œ๋งํฌ

 

1717๋ฒˆ: ์ง‘ํ•ฉ์˜ ํ‘œํ˜„

์ดˆ๊ธฐ์— $n+1$๊ฐœ์˜ ์ง‘ํ•ฉ $\{0\}, \{1\}, \{2\}, \dots , \{n\}$์ด ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ํ•ฉ์ง‘ํ•ฉ ์—ฐ์‚ฐ๊ณผ, ๋‘ ์›์†Œ๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์ง‘ํ•ฉ์„ ํ‘œํ˜„ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘

www.acmicpc.net



๐Ÿ”ธ ๋ฌธ์ œ ๋ถ„์„ ๐Ÿ”ธ

  • 0๋ถ€ํ„ฐ n๊นŒ์ง€ ์›์†Œ๊ฐ€ 1๊ฐœ์”ฉ ๋“ค์–ด์žˆ๋Š” n+1๊ฐœ์˜ ์ง‘ํ•ฉ์—์„œ ์ž…๋ ฅ ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
    • 0์€ ๋‘ ์ง‘ํ•ฉ์˜ ํ•ฉ์ง‘ํ•ฉ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
    • 1์€ ๋‘ ์ง‘ํ•ฉ์ด ๊ฐ™์€ ์ง‘ํ•ฉ์ธ์ง€ ํ™•์ธํ•ด, ๊ฐ™์œผ๋ฉด "YES" ํ˜น์€ "yes", ๋‹ค๋ฅด๋ฉด "NO" ํ˜น์€ "no"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
  • ์ „ํ˜•์ ์ธ union-find ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์ด๋‹ค.
    • ํ•ฉ์ง‘ํ•ฉ ์—ฐ์‚ฐ์€ union์„ ์‚ฌ์šฉํ•œ๋‹ค.
    • ๋‘ ์ง‘ํ•ฉ์ด ๊ฐ™์€ ์ง‘ํ•ฉ์ธ์ง€ ํ™•์ธ์€ find๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ˜ํ™˜๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.

๐Ÿ”ธ ์ฝ”๋“œ ๐Ÿ”ธ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    private static int[] parents;
    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());
        parents = new int[n+1];
        for (int i = 0; i <= n; i++) {
            parents[i] = i;
        }

        for (int i = 0; i < m; i++) {
            st = new StringTokenizer(br.readLine());
            if (Integer.parseInt(st.nextToken()) == 0) union(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
            else if (find(Integer.parseInt(st.nextToken())) == find(Integer.parseInt(st.nextToken())))
                System.out.println("YES");
            else
                System.out.println("NO");
        }
    }

    private static int find(int n) {
        if (parents[n] == n) return n;
        return parents[n] = find(parents[n]);
    }
    private static boolean union(int n1, int n2) {
        int p1 = find(n1);
        int p2 = find(n2);

        if(p1 == p2) return false;

        parents[p2] = p1;
        return true;
    }
}

๐Ÿ”ธ ์ฝ”๋“œ ํ•ด์„ ๐Ÿ”ธ

  • make-set() ๋ฉ”์„œ๋“œ๋Š” ๋”ฐ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  paretns๋ฐฐ์—ด์„ main์—์„œ ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค.
  • ์ž…๋ ฅ ์—ฐ์‚ฐ์ด 0์ผ ๊ฒฝ์šฐ๋Š” ๊ฐ ์›์†Œ๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋‘ ์ง‘ํ•ฉ์„ union ํ•œ๋‹ค.
  • ์ž…๋ ฅ ์—ฐ์‚ฐ์ด 1์ผ ๊ฒฝ์šฐ๋Š” ๊ฐ ์›์†Œ๋ฅผ find ์—ฐ์‚ฐ ํ›„ ๋ฐ˜ํ™˜๊ฐ’์„ ๋น„๊ตํ•œ๋‹ค.
    • ๋‘ ๋ฐ˜ํ™˜๊ฐ’์ด ๊ฐ™์œผ๋ฉด "YES"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
    • ๋‘ ๋ฐ˜ํ™˜๊ฐ’์ด ๋‹ค๋ฅด๋ฉด "NO"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

๐Ÿ”ธ end ๐Ÿ”ธ

  • union-find ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์•Œ๊ณ  ๋ฌธ์ œ๋ฅผ ๋ณด๋‹ˆ, ์•„์ฃผ ์‰ฝ๊ฒŒ ํ’€์ดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

728x90

'CodingTest > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ_14502 : ์—ฐ๊ตฌ์†Œ  (0) 2023.03.08
BOJ_1916 : ์ตœ์†Œ๋น„์šฉ ๊ตฌํ•˜๊ธฐ  (0) 2023.03.08
BOJ_1926 : ๊ทธ๋ฆผ  (0) 2023.03.05
BOJ_3109 : ๋นต์ง‘  (0) 2023.02.22
BOJ_6987 : ์›”๋“œ์ปต  (0) 2023.02.21