๐Ÿ‘จโ€๐Ÿ’ป Seungineer's GitHub Contribution

๐Ÿงญ KAIST JUNGLE/Algorithm

[๋ฐฑ์ค€]9466 - ํ…€ ํ”„๋กœ์ ํŠธ (#ํŒŒ์ด์ฌ #DFS #cycle๊ตฌํ˜„)

seungineer = seungwoo + engineer 2024. 12. 20. 22:15

 

 

 

9466๋ฒˆ: ํ…€ ํ”„๋กœ์ ํŠธ

 

boj.ma

๋ฌธ์ œ ์š”์•ฝ

๊ฐ๊ฐ์˜ ํ•™์ƒ์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ํƒ€ ํ•™์ƒ ๋ฒˆํ˜ธ ์ •๋ณด๋ฅผ ํ†ตํ•ด ๋ฌด๋ฆฌ(cycle)๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š๋Š” ํ•™์ƒ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•œ๋‹ค. ๊ฐ€๋ น A โžก๏ธ B โžก๏ธ C โžก๏ธ D โžก๏ธ E โžก๏ธ C ์ˆœ์„œ๋กœ ์ง€๋ช…ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌด๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง„ ํ•™์ƒ์€ C, D, E์ด๊ณ , ๋ฌด๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์€ ํ•™์ƒ์€ A, B์ด๋‹ค. ๊ฐ€๋ฆฌํ‚ค๋Š” ์ •๋ณด๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋”ฐ๋ผ๊ฐ€๊ธฐ ์œ„ํ•ด DFS ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ๋™์‹œ์— DFS ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’(๊ฒฐ๊ณผ)์„ ํ†ตํ•ด ๋ฌด๋ฆฌ ์ง€์–ด์กŒ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

DFS ๊ตฌ์„ฑ

DFS๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ?

์œ„ ์ด๋ฏธ์ง€ ์ฒ˜๋Ÿผ cycle์ด ํ˜•์„ฑ๋˜๋ฉด ํ˜•์„ฑ๋˜๋Š” ์ˆœ๊ฐ„์˜ ํ•™์ƒ์„ ๋ฌด๋ฆฌ ์นœ๊ตฌ๋“ค๋ผ๋ฆฌ ๊ฐ–๋Š”๋‹ค. DFS์˜ ๋ฐ˜ํ™˜ ๊ฐ’์œผ๋กœ '๋„์ฐฉ' ํ–ˆ์„ ๋•Œ์˜ ํ•™์ƒ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ดํ›„ DFS๊ฐ€ ๋ฐ˜ํ™˜(ํŒŒ๋ž€ ํ™”์‚ดํ‘œ)๋˜๋ฉด์„œ C๋ฅผ ๊ฑฐ์น˜๋Š” ๊ฒฝ์šฐ ๊ทธ ์ˆœ๊ฐ„(if (๊ธฐ์กด node == ๋ฐ˜ํ™˜๊ฐ’)) -1๊ณผ ๊ฐ™์€ ๋นˆ ๊ฐ’์„ ๋ฐ˜ํ™˜(๋นจ๊ฐ„ ํ™”์‚ดํ‘œ)ํ•˜์—ฌ ๋ฌด๋ฆฌ์— ์†ํ•˜์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์ฆ‰, ํ•ด๋‹น ๋ฌธ์ œ๋Š” DFS๋ฅผ ํ†ตํ•ด ์ˆœํšŒํ•œ ํ›„ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

F๊ฐ€ ๊ฐ‘์ž๊ธฐ B ๋˜๋Š” C๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค๋ฉด? ๐Ÿ™„

์ „์ฒด์ ์ธ ๋กœ์ง์€ ์œ„์™€ ๊ฐ™๊ณ , ์˜ˆ์™ธ ์ผ€์ด์Šค๋ฅผ ์ƒ๊ฐํ•ด๋ณธ๋‹ค. ํ˜„์žฌ DFS๋กœ ์ˆœํšŒํ•˜์ง€ ์•Š์€ ์นœ๊ตฌ(F)๊ฐ€ ์ด๋ฏธ ์ˆœํšŒํ•œ ์นœ๊ตฌ(A~E ์ค‘ ํ•˜๋‚˜)๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น case์˜ ์นœ๊ตฌ F ๊ฐ™์€ ๊ฒฝ์šฐ ์–ด๋–ค ์นœ๊ตฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋“  -1๊ณผ ๊ฐ™์€ ๋นˆ ๊ฐ’์„ ๋ฐ˜ํ™˜ ๋ฐ›์œผ๋ฉด ๋œ๋‹ค.

์™œ๋ƒํ•˜๋ฉด 1๏ธโƒฃ '๋„์ฐฉ'ํ•œ ํ•™์ƒ์˜ ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ฐ–๋Š” ์นœ๊ตฌ(C, D, E ์ค‘ ํ•˜๋‚˜)๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฌด๋ฆฌ ํ˜•์„ฑ์ด ์™„๋ฃŒ๋œ ๊ฒฝ์šฐ์ด๊ธฐ์— ์–ด๋–ค ๊ฒฝ์šฐ์—๋„ ์ƒˆ๋กœ์šด ์นœ๊ตฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ ๋ฌด๋ฆฌ์— ํฌํ•จ๋œ ์นœ๊ตฌ์˜€๋‹ค๋ฉด ์ด๋ฏธ DFS ์ˆœํšŒ์—์„œ ํฌํ•จ๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค. ์ด์— -1๊ณผ ๊ฐ™์€ ๋นˆ ๊ฐ’์„ ๋ฐ›๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•˜๋‹ค.

2๏ธโƒฃ ๋นˆ ๊ฐ’์„ ๋ฐ˜ํ™˜ ๋ฐ›์€ ํ•™์ƒ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹น ํ•™์ƒ์„ ๋”ฐ๋ผ ์ˆœํšŒํ•˜๋ฉด ๊ฒฐ๊ตญ ๋นˆ ๊ฐ’์„ ๋ฐ›์€ ํ•™์ƒ์œผ๋กœ ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋นˆ ๊ฐ’์„ ๋ฐ˜ํ™˜ ๋ฐ›์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. F โžก๏ธ A์ธ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด F๋Š” ๋ฌด์กฐ๊ฑด A๊ฐ€ ๋ฐ˜ํ™˜ ๋ฐ›์€ ๊ฐ’์„ ๋‹ค์‹œ ๋ฐ˜ํ™˜ ๋ฐ›๋Š”๋‹ค.

์œ„ ์˜ˆ์™ธ ์ผ€์ด์Šค๋Š” DFS ํ•จ์ˆ˜ ๋‚ด์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

def dfs(node):
        next_node = seq[node]
        
        if vis[next_node] != 0:
            vis_set.add(node)
            vis[node] = -1
            return -1

        ...

vis[next_node] ๊ฐ€ 0์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์€ ์ด๋ฏธ DFS๋ฅผ ํ†ตํ•ด ํ•œ ๋ฒˆ ์ˆœํšŒํ•œ ๊ฒƒ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ์ด ๊ฒฝ์šฐ ๋ฌด์กฐ๊ฑด -1๋กœ ๋ฐ˜ํ™˜๋˜๋„๋ก ํ•œ๋‹ค.

๋ฐ˜ํ™˜ ๊ฐ’์ด C์ด๋‹ค๊ฐ€ ์กฐ๊ฑด์— ๋”ฐ๋ผ -1๋กœ ๋ณ€ํ™˜๋˜๋Š” ์ฝ”๋“œ

DFS๊ฐ€ ๋ฐ˜ํ™˜(ํŒŒ๋ž€ ํ™”์‚ดํ‘œ)๋˜๋ฉด์„œ C๋ฅผ ๊ฑฐ์น˜๋Š” ๊ฒฝ์šฐ ๊ทธ ์ˆœ๊ฐ„(if (๊ธฐ์กด node == ๋ฐ˜ํ™˜๊ฐ’)) -1๊ณผ ๊ฐ™์€ ๋นˆ ๊ฐ’์„ ๋ฐ˜ํ™˜(๋นจ๊ฐ„ ํ™”์‚ดํ‘œ)ํ•˜์—ฌ ๋ฌด๋ฆฌ์— ์†ํ•˜์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

์œ„ ์„ค๋ช…๊ณผ ๊ฐ™์ด ๋ฐ˜ํ™˜ ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ๋ณ€ํ™˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์„๊นŒ?

def dfs(node):
        next_node = seq[node]
        
        ...
                
        if vis[next_node] == 0:
            vis_set.add(next_node)
            root = dfs(next_node)
            vis[next_node] = root
            
            if root == next_node: return -1
            return root

DFS๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’(root)์ด ํ˜„์žฌ์˜ node(= next_node)์™€ ๊ฐ™์€ ๊ฒฝ์šฐ -1์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ง€์† ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋œ๋‹ค.

Intuitive

๋ฐฑํŠธ๋ž˜ํ‚น์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋– ์˜ฌ๋ผ ํ•ด๋‹น ๋ฌธ์ œ์— ์ ์šฉ์‹œ์ผœ ๋ณด์•˜๋‹ค. ๋ฐฑํŠธ๋ž˜ํ‚น์—์„œ๋Š” DFS๋กœ ์ˆœํšŒ๋ฅผ ํ•˜๊ณ , return ๋˜๋ฉด์„œ '์–ด๋–ค ์กฐ์น˜'๋ฅผ ์ทจํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๋ฐฑํŠธ๋ž˜ํ‚น ์ฒ˜๋Ÿผ '์–ด๋–ค ์กฐ์น˜'๋ฅผ ์ทจํ•˜๊ณ  ๋‹ค์‹œ ๋‹ค์Œ depth๋กœ ์ˆœํšŒํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ˆœํšŒํ•œ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ๋น ์ ธ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์˜€๋‹ค.

 

๐Ÿ“ ์ฝ”๋“œ ์ „๋ฌธ