๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฌธ์ œ

[์ž๋ฐ”] ๋ฐฑ์ค€ 1717 - ์ง‘ํ•ฉ์˜ ํ‘œํ˜„

by applemango2021 2020. 12. 29.

์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ ๋ฌธ์ œ

 

1. ๋‚ด ๋ถ€๋ชจ๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ๋‹ด๋Š” ๋ฐฐ์—ด parent[i]์„ ์ผ๋‹จ ๋‚˜ ์ž์‹ ์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•œ๋‹ค. 

 

2. ํŒŒ์ธ๋“œ

- ๋‚ด ๋ถ€๋ชจ๊ฐ€ ์ •๋ง ์ตœ์ƒ์œ„ ๋ถ€๋ชจ์ธ์ง€ ๊ณ„์† ์ฐพ์•„ ๋‚˜๊ฐ€๋ฉด์„œ, ์ตœ์ƒ์œ„๊ฐ€ ์•„๋‹ ๋•Œ์—๋Š” ์ƒ์œ„์˜ ๋ถ€๋ชจ๋กœ ๊ฐ’์„ ๊ต์ฒดํ•œ๋‹ค. 

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

3. ์œ ๋‹ˆ์˜จ

- ๋‘ ์ˆซ์ž์˜ ๋ถ€๋ชจ๋ฅผ ํ™•์ธํ•ด์„œ, ๋ถ€๋ชจ ๊ฐ’์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋ถ€๋ชจ ๊ฐ’์„ a๋‚˜ b์˜ ๋ถ€๋ชจ๊ฐ’์œผ๋กœ ๊ต์ฒดํ•ด์ค€๋‹ค. ์–ด๋–ค ๊ฐ’์˜ ๋ถ€๋ชจ๋ฅผ ๋„ฃ์„ ๊ฒƒ์ธ์ง€๋Š” ์ƒ๊ด€์—†๋‹ค. 

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

์ „์ฒด ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

	static int[] parent;
	static int n;
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		String[] str = br.readLine().trim().split(" ");
		n = Integer.parseInt(str[0]);
		int m = Integer.parseInt(str[1]);
		
		parent = new int[n+1];
		for(int i=0;i<=n;i++) {
			parent[i] = i;
		}
		
		int k, a,b;
		for(int x=0;x<m;x++) {
			str = br.readLine().trim().split(" ");
			
			k = Integer.parseInt(str[0]);
			a = Integer.parseInt(str[1]);
			b = Integer.parseInt(str[2]);
			
			switch (k) {
			case 0:
				union(a,b);
				break;

			case 1:
				if( find(a) == find(b) ) sb.append("YES\n");
				else sb.append("NO\n");
				break;
			}
		}
		System.out.println(sb.toString().trim());

	}

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

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

์ฒ˜์Œ์—๋Š” ๋ถ€๋ชจ๊ฐ’์„ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ ํ•  ๋•Œ, ๊ธฐ์กด ๋ถ€๋ชจ๊ฐ’๊ณผ ๊ฐ™์€ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ ๋ชจ๋“  ์ž์‹๋“ค์„ ์ฐพ์•„์„œ ๋ถ€๋ชจ๊ฐ’์„ ๋ฐ”๊ฟ”์ฃผ๋ ค๊ณ  ํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด  parent[7] = 1์ด๊ณ , ๋ถ€๋ชจ๊ฐ’์„ 6์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ ๋ถ€๋ชจ๊ฐ’์„ 1๋กœ ๊ฐ€์ง€๋Š” ๋ชจ๋“  ์ž์‹์„ ์ฐพ์œผ๋ ค๊ณ  ๋งค๋ฒˆ for๋ฌธ์„ ๋Œ๋ ธ๋”๋‹ˆ ์•ฝ๊ฐ„ ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค. ๊ทผ๋ฐ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๊ตณ์ด for๋ฌธ์„ ๋Œ๋ ค์„œ ๋‹ค ๋ฐ”๊ฟ”์ค„ ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค. 

 

 

๋ฌธ์ œ์˜ ์˜ˆ์‹œ๋กœ ํ™•์ธํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

(์˜ˆ์‹œ์—์„œ๋Š” ์œ ๋‹ˆ์˜จ ์‹œ์— a์™€ b ์ค‘ a์˜ ๋ถ€๋ชจ๊ฐ’์œผ๋กœ ํ†ต์ผ์‹œ์ผœ์ค€๋‹ค. )

 

0) ์ดˆ๊ธฐ parent ๋ฐฐ์—ด

์›๋ž˜ ๊ฐ์ž ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ์„ธํŒ…๋˜์–ด ์žˆ๋‹ค.

๋‚˜ 1 2 3 4 5 6 7
๋ถ€๋ชจ๊ฐ’ 1 2 3 4 5 6 7

 

1) 0 1 3

3์˜ ๋ถ€๋ชจ๊ฐ’์ด 1๋กœ ๋ฐ”๋€๋‹ค.

๋‚˜ 1 2 3 4 5 6 7
๋ถ€๋ชจ๊ฐ’ 1 2 1 4 5 6 7

 

2) 0 7 6

6์˜ ๋ถ€๋ชจ๊ฐ’์ด 7๋กœ ๋ฐ”๋€๋‹ค.

๋‚˜ 1 2 3 4 5 6 7
๋ถ€๋ชจ๊ฐ’ 1 2 1 4 5 7 7

 

3) 0 3 7

7์˜ ๋ถ€๋ชจ๊ฐ’์ด 1๋กœ ๋ฐ”๋€๋‹ค. 

๋‚˜ 1 2 3 4 5 6 7
๋ถ€๋ชจ๊ฐ’ 1 2 1 4 5 7 1

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ 3๊ณผ 6์ด ๊ฐ™์€ ์ง‘ํ•ฉ์ธ์ง€ ๋ฌผ์–ด๋ดค์„ ๋•Œ, parent[3]=1์ด๊ณ  parent[6]=7์ด๋‹ˆ๊นŒ ๋‹น์—ฐํžˆ ๋ชป ์ฐพ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ find()๋กœ์ง์„ ๋ณด๋ฉด parent[x]=x, ์ฆ‰ ๋‚˜์™€ ๋ถ€๋ชจ๊ฐ’์ด ๊ฐ™์„ ๋•Œ์—๋งŒ x๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์‹œ find()๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์„ parent[x]์— ์ง‘์–ด๋„ฃ๊ฒŒ ๋˜์–ด์žˆ๋‹ค. 

๋‹ค์‹œ ๋งํ•ด, find(6)์„ ํ•˜๋ฉด ์•„๋ž˜ ์ˆœ์„œ์— ๋”ฐ๋ผ์„œ ๊ฒฐ๊ตญ parent[6]=parent[7]=parent[1]=1์ด ๋œ๋‹ค. ์–ด์ฐจํ”ผ ๋‚˜์™€ ๋ถ€๋ชจ๊ฐ’์ด ๊ฐ™์„ ๋•Œ๊นŒ์ง€ find()์—์„œ ํƒ€๊ณ ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ๋งค๋ฒˆ for๋ฌธ ํ†ตํ•ด์„œ ๋ถ€๋ชจ๊ฐ’์„ ๋ฐ”๊ฟ”์ค„ ํ•„์š”๋„ ์—†๊ณ , ๋งˆ์ฐฌ๊ฐ€์ง€ ์ด์œ ๋กœ a๋ž‘ b์˜ ๋ถ€๋ชจ๊ฐ’์ค‘ ์–ด๋–ค ๋ถ€๋ชจ๊ฐ’์„ ์„ ํƒํ•ด๋„ ์ƒ๊ด€์ด ์—†๋‹ค. 

ํ˜ธ์ถœ์ˆœ์„œ    
3 return parent[1]=1 //parent[x]=x์ด๊ธฐ ๋•Œ๋ฌธ์— 1์„ ๋ฆฌํ„ดํ•œ๋‹ค
2 else return parent[7]=find(parent[1]) //์—ฌ๊ธฐ์„œ parent[7]=1๋กœ ๊ฐ’์ด ๊ต์ฒด๋œ๋‹ค
1 else return parent[6]=find(parent[6])
                                  =7
//์—ฌ๊ธฐ์„œ parent[6]์˜ ๊ฐ’๋„ 1๋กœ ๊ต์ฒด๋œ๋‹ค

์ „์ฒด์ฝ”๋“œ