Algorithm & Data Structures/BOJ

b4195. ์นœ๊ตฌ๋„คํŠธ์›Œํฌ

Geisha 2025. 5. 8. 21:46

 

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

 

 

 

๐Ÿ‘ฅ ์ž๋ฐ”๋กœ ํ‘ธ๋Š” ์นœ๊ตฌ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ ํ’€์ด

 


 

๐Ÿ“Œ ๋ฌธ์ œ ๊ฐœ์š”

 

๋ฐฑ์ค€ 4195๋ฒˆ - ์นœ๊ตฌ ๋„คํŠธ์›Œํฌ ๋ฌธ์ œ๋Š”

์—ฌ๋Ÿฌ ๋ช…์ด ์นœ๊ตฌ ๊ด€๊ณ„๋กœ ์—ฐ๊ฒฐ๋  ๋•Œ,

๊ฐ ๊ด€๊ณ„๋งˆ๋‹ค ํ˜„์žฌ ์นœ๊ตฌ ๋„คํŠธ์›Œํฌ์˜ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

  • ์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ์ฃผ์–ด์ง (A B → A์™€ B๊ฐ€ ์นœ๊ตฌ)
  • ์นœ๊ตฌ ๊ด€๊ณ„๊ฐ€ ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค, A์™€ B๊ฐ€ ์†ํ•œ ์ „์ฒด ๋„คํŠธ์›Œํฌ(์—ฐ๊ฒฐ๋œ ์ง‘ํ•ฉ)์˜ ํฌ๊ธฐ๋ฅผ ์ถœ๋ ฅ
  • ์ด๋ฆ„์€ ๋ฌธ์ž์—ด๋กœ ์ฃผ์–ด์ง

 


 

๐Ÿ’ก ์˜ˆ์ œ ์ž…๋ ฅ

2
3
Fred Barney
Barney Betty
Betty Wilma
3
Fred Barney
Betty Wilma
Barney Betty

 

์˜ˆ์ œ ์ถœ๋ ฅ

2  
3  
4  
2  
2  
4

 

 


 

๐Ÿ›  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ‘๊ทผ ๋ฐฉ์‹

 

  • ํ•ต์‹ฌ์€ Union-Find (Disjoint Set) ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ์ด๋ฆ„์ด ๋ฌธ์ž์—ด์ด๊ธฐ ๋•Œ๋ฌธ์—, HashMap<String, Integer>๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด์„ ์ •์ˆ˜ ์ธ๋ฑ์Šค๋กœ ๋งคํ•‘
  • union(a, b) ์—ฐ์‚ฐ์„ ํ•  ๋•Œ๋งˆ๋‹ค ๋‘ ์ง‘ํ•ฉ์„ ๋ณ‘ํ•ฉํ•˜๊ณ , ๋ณ‘ํ•ฉ๋œ ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜

 


 

โœ… ๊ตฌํ˜„ ์•„์ด๋””์–ด

 

  • p[]: ๊ฐ ๋…ธ๋“œ์˜ ๋ถ€๋ชจ๋ฅผ ์ €์žฅ (Find ์‹œ ์‚ฌ์šฉ)
  • size[]: ๊ฐ ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ ์ €์žฅ (๋ฃจํŠธ ๊ธฐ์ค€์œผ๋กœ๋งŒ ์˜๋ฏธ ์žˆ์Œ)
  • HashMap<String, Integer>: ์ด๋ฆ„์„ ์ •์ˆ˜ ์ธ๋ฑ์Šค๋กœ ๋งคํ•‘
  • find(x): ๊ฒฝ๋กœ ์••์ถ• ์ ์šฉ
  • union(a, b): ๋” ์ž‘์€ ๋ฒˆํ˜ธ์˜ ๋ฃจํŠธ๋กœ ๋ณ‘ํ•ฉํ•˜๊ณ  ํฌ๊ธฐ ์—…๋ฐ์ดํŠธ

 


 

๐Ÿงพ ์ฝ”๋“œ ํ•ด์„ค

// ์ด๋ฆ„์„ ์ •์ˆ˜๋กœ ๋งคํ•‘ํ•˜๊ณ  ์ดˆ๊ธฐํ™”
if (!name.containsKey(a)) name.put(a, count++);
if (!name.containsKey(b)) name.put(b, count++);
// find ํ•จ์ˆ˜: ๊ฒฝ๋กœ ์••์ถ• ์ ์šฉ
private static int find(int x) {
    if (p[x] != x)
        p[x] = find(p[x]);
    return p[x];
}
// union ํ•จ์ˆ˜: ๋ฃจํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ณ‘ํ•ฉํ•˜๊ณ  size ์—…๋ฐ์ดํŠธ
private static int union(int a, int b) {
    int pa = find(a);
    int pb = find(b);
    if (pa == pb) return size[pa];

    if (pa < pb) {
        p[pb] = pa;
        size[pa] += size[pb];
        return size[pa];
    } else {
        p[pa] = pb;
        size[pb] += size[pa];
        return size[pb];
    }
}

 

 


 

โœ… ํ•ต์‹ฌ ํฌ์ธํŠธ

 

  • ๋ฌธ์ž์—ด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ˆ˜์น˜ํ™”ํ•˜๊ธฐ ์œ„ํ•ด HashMap์„ ์‚ฌ์šฉ
  • Union-Find + size ๋ฐฐ์—ด์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด, ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถ”์ 
  • ๋…ธ๋“œ ์ˆ˜๊ฐ€ ๋งŽ์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ถฉ๋ถ„ํ•œ ๋ฐฐ์—ด ํฌ๊ธฐ ํ™•๋ณด (200_001)
  • find()์— ๊ฒฝ๋กœ ์••์ถ•์„ ์ ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ

 


 

โœจ ๊ฒฐ๋ก : ๋ฌธ์ž์—ด ๋ฌธ์ œ์ง€๋งŒ ๊ฒฐ๊ตญ์€ ๊ทธ๋ž˜ํ”„ ๋ฌธ์ œ

 

์ด ๋ฌธ์ œ๋Š” ์ž…๋ ฅ์€ ๋ฌธ์ž์—ด ๊ธฐ๋ฐ˜์ด์ง€๋งŒ,

์‹ค์ œ๋กœ๋Š” ๊ทธ๋ž˜ํ”„์˜ ์—ฐ๊ฒฐ ๊ด€๊ณ„์™€ ์ง‘ํ•ฉ ํฌ๊ธฐ ์ถ”์ ์ด๋ผ๋Š” ์ „ํ˜•์ ์ธ Union-Find ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

“์‚ฌ๋žŒ์€ ๋ฌธ์ž์—ด์ด์ง€๋งŒ, ์—ฐ๊ฒฐ์€ ์ˆ˜๋กœ ๋ชจ๋ธ๋งํ•œ๋‹ค.”
→ ์ด์ฒ˜๋Ÿผ ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์„ ๊ตฌ์กฐํ™”ํ•˜๋Š” ๋Šฅ๋ ฅ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.