์•Œ๊ณ ๋ฆฌ์ฆ˜/์ˆ˜ํ•™

[๋ฐฑ์ค€ 1717 ๐Ÿฅ‡] ์ง‘ํ•ฉ์˜ ํ‘œํ˜„

1eehyunji 2023. 7. 16. 01:33

 

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

 

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

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

www.acmicpc.net

๋ฌธ์ œํ’€์ด

import sys
sys.setrecursionlimit(100000)

n,m=map(int, sys.stdin.readline().split())

# union-find ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉ
# ์ง‘ํ•ฉ์˜ root ๋ฒˆํ˜ธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฐ์—ด ์‚ฌ์šฉ
root_set=[x for x in range(n+1)]

def find(num):
    global root_set
    if num!=root_set[num]:
        root_set[num] = find(root_set[num])
    return root_set[num]
    # if num==root_set[num]:
    #     return num
    # else:
    #     root_set[num]=find(root_set[num])

def union(x,y):
    global root_set
    x=find(x)
    y=find(y)
    root_set[y]=x


for _ in range(m):
    command, n1, n2=map(int, sys.stdin.readline().split())
    if command==0:
        # ๋‘ ๋ฒˆํ˜ธ๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์„ ํ•ฉ์นœ๋‹ค.
        union(n1,n2)
    elif command==1:
        # ๋‘ ๋ฒˆํ˜ธ๊ฐ€ ๊ฐ™์€ ์ง‘ํ•ฉ์— ์†ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
        if find(n1)==find(n2):
            print('YES')
        else:
            print('NO')

์ง‘ํ•ฉ์„ ํ•ฉ์น˜๊ณ , ์ง‘ํ•ฉ์˜ ๋ฃจํŠธ๋ฅผ ์ฐพ๋Š” Union-Find ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. 

์ง‘ํ•ฉ์„ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ตฌํ˜„ํ•ด์„œ ์ง‘ํ•ฉ๋ผ๋ฆฌ ํ•ฉ์ณ์ค„ ๋•, ๊ฐ™์€ ๋ฃจํŠธ๋ฅผ ๊ฐ€์ง€๋Š” ํŠธ๋ฆฌ๋กœ ๋งŒ๋“ค์–ด์ฃผ๊ณ ,

๋™์ผํ•œ ์ง‘ํ•ฉ์— ์†ํ•˜๋Š”์ง€ ์ฐพ์„ ๋•Œ๋Š” ๋™์ผํ•œ ๋ฃจํŠธ๋ฅผ ๊ฐ€์ง€๋Š”์ง€ ํ™•์ธํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

๋ชจ๋“  ์ง‘ํ•ฉ์˜ ๋ฃจํŠธ๋ฅผ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.

index 0 1 2 3 4 5 6 7
  0 1 2 3 4 5 6 7

๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์ˆซ์ž๊ฐ€ ์†ํ•œ ์ง‘ํ•ฉ์˜ ๋ฃจํŠธ๋ฅผ ์ฐพ์•„์ฃผ๋Š” find ํ•จ์ˆ˜๋Š” ๋ฃจํŠธ๋ฅผ ์ฐพ๋Š” ์ˆซ์ž์˜ root_set[] ๋ฐฐ์—ด ๊ฐ’์ด ์ž๊ธฐ ์ž์‹ ๊ณผ ๊ฐ™์„ ๋•Œ ์ฆ‰, ํ•ด๋‹น ์ˆซ์ž์˜ ์œ„์— ์–ด๋–ค ์ˆซ์ž๋„ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๋ฃจํŠธ์ผ ๋•Œ๊นŒ์ง€ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์ตœ์ข… ๋ฃจํŠธ๋ฅผ ์ฐพ๋Š”๋‹ค. 

์ด ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ TypeError๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. 

def find(num):
    global root_set
    if num==root_set[num]:
        return num
    else:
        root_set[num]=find(root_set[num])

์ฒ˜์Œ์— find ํ•จ์ˆ˜๋ฅผ ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์—ˆ๋Š”๋ฐ, ๋””๋ฒ„๊น…์„ ํ•ด๋ณด๋‹ˆ union ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ find ํ•จ์ˆ˜๊ฐ€ 'None'๋ฅผ ๋ฐ˜ํ™˜ํ•œ ์ƒํƒœ์—์„œ root_set ๋ฐฐ์—ด ๊ฐ’์„ ์„ค์ •ํ•ด์ฃผ๋ ค๋‹ค ๋ณด๋‹ˆ ํƒ€์ž… ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ฆ‰, root_set[None]์— ์–ด๋–ค ๊ฐ’์„ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ root_set[์–ด๋–ค ์ˆ˜]=None์„ ํ• ๋‹นํ•˜๋ ค ํ•œ ๊ฒƒ์ด๋‹ค.

๊ทธ ๊ฒฐ๊ณผ, root_set ๋ฐฐ์—ด ์•ˆ์— None๊ฐ’์ด ๋“ค์–ด๊ฐ€๋‹ค๋ณด๋‹ˆ ํƒ์ƒ‰ ๊ณผ์ •์—์„œ ํƒ€์ž…์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ root_set[None]์— ์–ด๋–ค ๊ฐ’์„ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ณผ์ •์—์„œ ํƒ€์ž…์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค. 

์ด๋Ÿฌํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ์ผ์ด ๋ฐœ์ƒํ•œ ์ด์œ ๋ฅผ ์ฐพ์•„๋ณด๋‹ˆ 

์œ„ ์˜ˆ์‹œ์—์„  root_set=[0,1,2,1,4,5,7,7]์ธ ์ƒํ™ฉ์—์„œ find(3)์„ ํ•  ๋•Œ ํ•ด๋‹น ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๋‹ค. 

์œ„์™€ ๊ฐ™์ด, return ๊ฐ’์ด ์—†๋Š” ์ƒํƒœ๋กœ find(3)์ด ์ข…๋ฃŒ๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ธฐ๋Š” ์ผ์ด์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ find ํ•จ์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ–ˆ๋‹ค. 

def find(num):
    global root_set
    if num!=root_set[num]:
        root_set[num] = find(root_set[num])
    return root_set[num]

๊ผผ๊ผผํ•˜๊ฒŒ ์ฝ”๋”ฉํ•˜์ž...!

๊ทธ๋ฆฌ๊ณ  ๋‘ ์ง‘ํ•ฉ์„ ํ•ฉ์ณ์ฃผ๋Š” union ํ•จ์ˆ˜๋Š” find ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ ์ˆ˜์˜ ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„์„œ ๊ฐ™์€ ๋ฃจํŠธ๋ฅผ ๊ฐ€์ง€๋„๋ก ํ• ๋‹นํ•ด์ค€๋‹ค. 

์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๊ฑฐ์น˜๋‹ค๋ณด๋ฉด root_set ๋ฐฐ์—ด์€ ๊ฐ๊ฐ ์ž์‹ ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ๊ฐ€ ๋˜๊ณ , find ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ์ตœ์ข… ๋ฃจํŠธ๋ฅผ ์ฐพ์•„๊ฐ€๋ฉด์„œ ๊ฐ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ต์„ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค. (YES or NO)

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

[๋ฐฑ์ค€ 1010 ๐Ÿฅˆ] ๋‹ค๋ฆฌ ๋†“๊ธฐ  (0) 2023.11.02
[๋ฐฑ์ค€ 2559 ๐Ÿฅˆ] ์ˆ˜์—ด  (0) 2023.07.31