์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ(Union-Find) ์•Œ๊ณ ๋ฆฌ์ฆ˜

๐Ÿ”น ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ(Union-Find) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ ?

  • ํŠธ๋ฆฌ/๊ทธ๋ž˜ํ”„์˜ ๋Œ€ํ‘œ์  ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๊ทธ๋ž˜ํ”„์— ์†ํ•˜๋Š”์ง€ ํŒ๋ณ„ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  • ์ƒํ˜ธ ๋ฐฐํƒ€์  ์ง‘ํ•ฉ, ์„œ๋กœ์†Œ ์ง‘ํ•ฉ(Disjoint-Set)์œผ๋กœ๋„ ๋ถˆ๋ฆฐ๋‹ค.
  • ๋…ธ๋“œ๋ฅผ ํ•ฉ์น˜๋Š” Union ์—ฐ์‚ฐ๊ณผ ๋…ธ๋“œ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” Find ์—ฐ์‚ฐ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

 

๐Ÿ”น ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ ๊ตฌํ˜„ - JAVA

[ find ์—ฐ์‚ฐ ]

private static int find(int x) {
	if (parents[x] == x) return x;
	return parents[x] = find(parents[x]);
}
  • ํŠน์ • ๋…ธ๋“œ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค.
  • ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ์™€ ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๋น„๊ตํ•œ๋‹ค. ์ด๋•Œ ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ, ํ•ด๋‹น ๋…ธ๋“œ๋Š” ๋ฃจํŠธ ๋…ธ๋“œ์ด๋‹ค.
  • ๋งŒ์•ฝ ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด, ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ์— ๋Œ€ํ•˜์—ฌ find ์—ฐ์‚ฐ์„ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•œ๋‹ค.

[ union ์—ฐ์‚ฐ ]

public static boolean union(int x, int y) {
    x = find(x);
    y = find(y);
    
    if (x == y) return false;
    
    if (x < y) parents[y] = x;
    else parents[x] = y;
    return true;
}
  • ๋‘ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ํฌํ•จ๋œ ์ง‘ํ•ฉ์„ ํ•˜๋‚˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ•ฉ์น˜๋Š” ์—ฐ์‚ฐ์ด๋‹ค.
  • ๋‘ ๋…ธ๋“œ์— ๋Œ€ํ•ด find ์—ฐ์‚ฐ์„ ๊ฐ๊ฐ ์ˆ˜ํ–‰ํ•˜์—ฌ, ๋‘ ๋…ธ๋“œ๊ฐ€ ๊ฐ๊ฐ ์†ํ•œ ์ง‘ํ•ฉ์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„๋‚ธ๋‹ค.
  • ์ด๋ฏธ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์žˆ๋‹ค๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋‹ค๋ฅธ ์ง‘ํ•ฉ์— ์†ํ•ด์žˆ๋‹ค๋ฉด, ๋” ์ž‘์€ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ์ณ์ค€๋‹ค.

 

 

 

 

 

๐Ÿ“ƒ reference