🧩 Algorithm/κ°œλ… 및 자료ꡬ쑰

[μ•Œκ³ λ¦¬μ¦˜] BFS/DFS μ•Œκ³ λ¦¬μ¦˜ (κ·Έλž˜ν”„ 탐색)

devCloud 2023. 5. 15. 16:38
728x90

κ·Έλž˜ν”„ 탐색(Graph Search)

κ·Έλž˜ν”„ νƒμƒ‰μ΄λž€ ν•˜λ‚˜μ˜ μ •μ μœΌλ‘œλΆ€ν„° μ‹œμž‘ν•˜μ—¬ μ°¨λ‘€λŒ€λ‘œ λͺ¨λ“  정점듀을 ν•œλ²ˆμ”© λ°©λ¬Έν•˜λŠ” 것을 λ§ν•œλ‹€. λ‹¨μˆœνžˆ κ·Έλž˜ν”„μ˜ λ…Έλ“œλ₯Ό νƒμƒ‰ν•˜λŠ” κ²ƒμœΌλ‘œ 문제λ₯Ό ν•΄κ²°ν•œλ‹€. κ·Έλž˜ν”„ νƒμƒ‰μ—λŠ” BFS/DFSκ°€ μžˆλ‹€. 

βœ” BFS(Breadth First Search) μ •μ˜

λ„ˆλΉ„ μš°μ„  νƒμƒ‰μ΄λΌλŠ” 뜻이고, μ‰½κ²Œ 말해 κ°€κΉŒμš΄ λ…Έλ“œλΆ€ν„° νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€. μ•„λž˜μ˜ 그림을 λ³΄λ©΄μ„œ μ‰½κ²Œ μ΄ν•΄ν•΄λ³΄μž.

μœ„μ˜ κ·Έλ¦Όκ³Ό 같이 6개의 λ…Έλ“œμ™€ 5개의 κ°„μ„ (λ…Έλ“œμ˜ 개수-1)이 μžˆλ‹€. λ…Έλ“œ 1λ²ˆλΆ€ν„° μ‹œμž‘ν•΄μ„œ 2λ²ˆμ„ νƒμƒ‰ν•˜κ³  λ‹€μŒμœΌλ‘œ 4번 λ…Έλ“œλ₯Ό νƒμƒ‰ν•˜λŠ” 게 μ•„λ‹Œ 3번 λ¨Όμ € νƒμƒ‰ν•˜λŠ” 것이닀. 3번 μ˜†μ— 아무것도 μ—†μœΌλ―€λ‘œ λ‹€μ‹œ 2번 λ…Έλ“œλ‘œ λŒμ•„μ™€μ„œ  2번 λ…Έλ“œμ˜ ν•˜μœ„ λ…Έλ“œ 쀑 ν•˜λ‚˜μΈ 4λ²ˆμ„ νƒμƒ‰ν•œλ‹€. 4λ²ˆμ„ λλƒˆμœΌλ©΄ λ‹€μŒ 5번, λ§ˆμ§€λ§‰μœΌλ‘œ 6번 λ…Έλ“œλ₯Ό 탐색을 끝으둜 트리λ₯Ό λͺ¨λ‘ νƒμƒ‰ν•œ 것을 보여쀀닀. 

우츑 그림의 NxN κ·Έλ¦¬λ“œμΌ κ²½μš°λ„ 보자. 4x4 κ·Έλ¦¬λ“œμΌ κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€λ‘œ 1λ²ˆλΆ€ν„° μ‹œμž‘ν•΄μ„œ 였λ₯Έμͺ½μœΌλ‘œ 탐색을 ν•œλ‹€. 4번 칸의 탐색이 λλ‚¬μœΌλ©΄ 5λ²ˆλΆ€ν„° λ‹€μ‹œ 였λ₯Έμͺ½μœΌλ‘œ νƒμƒ‰ν•œλ‹€. μœ„ 과정을 계속 λ°˜λ³΅ν•˜λ©΄ 16λ²ˆκΉŒμ§€ 탐색을 끝으둜 λͺ¨λ“  칸의 탐색이 끝이 λ‚œλ‹€.

 

Queue(큐)λ₯Ό 이용

BFSλŠ” 큐λ₯Ό μ΄μš©ν•΄μ„œ 문제λ₯Ό ν‘Όλ‹€. κ°„λ‹¨νžˆ 큐에 λŒ€ν•΄ μ•Œμ•„λ³΄μž.

 

Queue(큐) μžλ£Œκ΅¬μ‘°λž€?

FIFO(First In First Out) ꡬ쑰이고, λ¨Όμ € λ“€μ–΄μ˜¨ 데이터가 큐에 λ¨Όμ € λ“€μ–΄κ°€κ³ , νμ—μ„œ λ‚˜μ˜¬ λ•Œλ„ λ¨Όμ € λ“€μ–΄μ˜¨ 데이터가 λΉ μ§€λŠ” 것을 λ§ν•œλ‹€. μ•„λž˜ 그림을 보면, 큐에 0번 λ…Έλ“œκ°€ λ¨Όμ € 듀어와 μžˆμœΌλ‹ˆ νμ—μ„œ λ‚˜κ°ˆ λ•Œλ„ 0번이 λ¨Όμ € λ‚˜κ°€μ•Ό ν•˜λŠ” 것이닀.

λ‹€μŒ μ˜ˆμ‹œλ₯Ό 보고 큐λ₯Ό μ΄μš©ν•΄ BFS의 λ™μž‘ 방식을 μ‚΄νŽ΄λ³΄μž.

μœ„μ™€ 같은 κ·Έλž˜ν”„μ™€ 큐가 μ£Όμ–΄μ‘Œλ‹€κ³  ν•˜μž. μΈμ ‘ν•œ λ…Έλ“œκ°€ μ—¬λŸ¬ 개 μžˆμ„ λ•Œ, μˆ«μžκ°€ μž‘μ€ λ…Έλ“œλΆ€ν„° λ¨Όμ € 큐에 μ‚½μž…ν•œλ‹€κ³  κ°€μ •ν•œλ‹€. (νμ—μ„œ κΊΌλ‚΄ μ²˜λ¦¬ν•˜λŠ” λ…Έλ“œλŠ” ν•˜λŠ˜μƒ‰μœΌλ‘œ, λ°©λ¬Έ 처리된 λ…Έλ“œλŠ” νšŒμƒ‰μœΌλ‘œ ν‘œμ‹œ) 

 

β‘  μ‹œμž‘ λ…Έλ“œλ₯Ό 0으둜 μ •ν•œλ‹€. 0을 큐에 μ‚½μž…ν•˜κ³  λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.

β‘‘ νμ—μ„œ 0을 κΊΌλ‚΄κ³  0κ³Ό μΈμ ‘ν•œ 1을 큐에 μ‚½μž…ν•œλ‹€. 큐에 μ‚½μž…λœ 1은 λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.

β‘’ 1을 νμ—μ„œ κΊΌλ‚΄κ³  1κ³Ό μΈμ ‘ν•œ 2, 3을 큐에 λͺ¨λ‘ μ‚½μž…ν•œλ‹€. 2와 3은 λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.

β‘£ 2λ₯Ό νμ—μ„œ κΊΌλ‚΄κ³ , 2와 μΈμ ‘ν•œ 4번 λ…Έλ“œλ₯Ό 큐에 μ‚½μž…ν•˜κ³  λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.

β‘€ 3을 νμ—μ„œ κΊΌλ‚΄κ³ , 3κ³Ό μΈμ ‘ν•œ 5번 λ…Έλ“œλ₯Ό 큐에 μ‚½μž…ν•˜κ³  λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.

μ΄λŸ°μ‹μœΌλ‘œ 계속 λ°˜λ³΅ν•˜λ©΄ 좜λ ₯ κ²°κ³ΌλŠ” ⓿❢❷❸❹❺❻❼❽

인접 λ…Έλ“œλ₯Ό λͺ¨λ‘ 큐에 λ„£κ³  λ¨Όμ € λ“€μ–΄κ°„ 것뢀터 κΊΌλ‚Έλ‹€. κΊΌλƒˆμœΌλ©΄ κΊΌλ‚Έ λ…Έλ“œμ™€ μΈμ ‘ν•œ λ…Έλ“œκ°€ 있으면 λͺ¨λ‘ 큐에 λ„£κ³  λ°˜λ³΅ν•œλ‹€. 


βœ” DFS(Depth First Search) μ •μ˜

깊이 μš°μ„  νƒμƒ‰μ΄λΌλŠ” 뜻이고, κ·Έλž˜ν”„μ—μ„œ κΉŠμ€ 뢀뢄을 μš°μ„ μ μœΌλ‘œ νƒμƒ‰ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€. μ•„λž˜μ˜ 그림을 λ³΄λ©΄μ„œ μ‰½κ²Œ μ΄ν•΄ν•΄λ³΄μž. 

λ…Έλ“œ 1λ²ˆλΆ€ν„° μ‹œμž‘ν•΄μ„œ 2λ²ˆμ„ νƒμƒ‰ν•˜κ³  λ‹€μŒμœΌλ‘œ 2번 ν•˜μœ„ λ…Έλ“œ 쀑 3번과 4번 λ…Έλ“œλ₯Ό νƒμƒ‰ν•œλ‹€. 3번 ν•˜μœ„λ…Έλ“œλŠ” μ—†μœΌλ―€λ‘œ, 2번 ν•˜μœ„ λ…Έλ“œμΈ 4번 λ…Έλ“œλ₯Ό νƒμƒ‰ν•œλ‹€. 4번 ν•˜μœ„λ…Έλ“œλ„ μ—†μœΌλ―€λ‘œ, 1λ²ˆλ…Έλ“œλ‘œ λŒμ•„μ™€ νƒμƒ‰ν•˜μ§€ μ•Šμ€ 5번 λ…Έλ“œλ₯Ό λ§ˆμ € νƒμƒ‰ν•œλ‹€. 5번 λ…Έλ“œλ₯Ό νƒμƒ‰ν•˜κ³ , λ§ˆμ§€λ§‰μœΌλ‘œ ν•˜μœ„λ…Έλ“œμΈ 6번 λ…Έλ“œλ₯Ό 탐색을 끝으둜 트리λ₯Ό λͺ¨λ‘ νƒμƒ‰ν•œ 것을 보여쀀닀. 

우츑 그림의 NxN κ·Έλ¦¬λ“œμΌ κ²½μš°λ„ 보자. 4x4 κ·Έλ¦¬λ“œμΌ κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€λ‘œ 1λ²ˆλΆ€ν„° μ‹œμž‘ν•΄μ„œ μ•„λž˜μͺ½μœΌλ‘œ 탐색을 ν•œλ‹€. BFS λ•Œμ™€λŠ” 였λ₯Έμͺ½μœΌλ‘œ 탐색을 ν–ˆμ§€λ§Œ DFSλŠ” μ•„λž˜μͺ½μœΌλ‘œ 탐색을 ν•œλ‹€. 13번 칸의 탐색이 λλ‚¬μœΌλ©΄ 2λ²ˆλΆ€ν„° λ‹€μ‹œ μ•„λž˜μͺ½μœΌλ‘œ νƒμƒ‰ν•œλ‹€. μœ„ 과정을 계속 λ°˜λ³΅ν•˜λ©΄ 16λ²ˆκΉŒμ§€ 탐색을 끝으둜 λͺ¨λ“  칸의 탐색이 끝이 λ‚œλ‹€. 

Stack(μŠ€νƒ)을 이용

DFSλŠ” 큐λ₯Ό μ΄μš©ν•΄μ„œ 문제λ₯Ό ν‘Όλ‹€. κ°„λ‹¨νžˆ μŠ€νƒμ— λŒ€ν•΄ μ•Œμ•„λ³΄μž.

 

Stack(μŠ€νƒ) μžλ£Œκ΅¬μ‘°λž€?

FILO(First In Last Out) ꡬ쑰이고, λ¨Όμ € λ“€μ–΄μ˜¨ 데이터가 μŠ€νƒμ— λ¨Όμ € λ“€μ–΄κ°€κ³ , μŠ€νƒμ—μ„œ λ‚˜μ˜¬ λ•ŒλŠ” λ‚˜μ€‘μ— λ“€μ–΄μ˜¨ 데이터가 λ¨Όμ € λΉ μ§€λŠ” 것을 λ§ν•œλ‹€. μ•„λž˜ 그림을 보면, μŠ€νƒμ— 0번 λ…Έλ“œκ°€ λ¨Όμ € 듀어와 μžˆμœΌλ‚˜ μŠ€νƒμ—μ„œ λ‚˜κ°ˆ λ•ŒλŠ” 1번이 λ¨Όμ € λ‚˜κ°€μ•Ό ν•˜λŠ” 것이닀. μŠ€νƒμ˜ μΆœμž…κ΅¬κ°€ λ™μΌν•˜λ―€λ‘œ, ν•œμͺ½μ€ λ§‰ν˜€μžˆλ‹€κ³  μƒκ°ν•˜λ©΄ λœλ‹€.

λ‹€μŒ μ˜ˆμ‹œλ₯Ό 보고 μŠ€νƒ μ΄μš©ν•΄ BFS의 λ™μž‘ 방식을 μ‚΄νŽ΄λ³΄μž.

μœ„μ™€ 같은 κ·Έλž˜ν”„μ™€ μŠ€νƒμ΄ μ£Όμ–΄μ‘Œλ‹€κ³  ν•˜μž. μΈμ ‘ν•œ λ…Έλ“œκ°€ μ—¬λŸ¬ 개 μžˆμ„ λ•Œ, μˆ«μžκ°€ μž‘μ€ λ…Έλ“œλΆ€ν„° λ¨Όμ € μŠ€νƒμ— μ‚½μž…ν•œλ‹€κ³  κ°€μ •ν•œλ‹€. (μŠ€νƒμ—μ„œ κΊΌλ‚΄ μ²˜λ¦¬ν•˜λŠ” λ…Έλ“œλŠ” ν•˜λŠ˜μƒ‰μœΌλ‘œ, λ°©λ¬Έ 처리된 λ…Έλ“œλŠ” νšŒμƒ‰μœΌλ‘œ ν‘œμ‹œ) 

 

β‘  μ‹œμž‘ λ…Έλ“œλ₯Ό 0으둜 μ •ν•œλ‹€. 0을 μŠ€μ— μ‚½μž…ν•˜κ³  λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.

β‘‘ ν˜„μž¬ μŠ€νƒμ˜ μ΅œμƒλ‹¨ λ…Έλ“œμΈ 0에 λ°©λ¬Έν•˜μ§€ μ•Šμ€ 인접 λ…Έλ“œμΈ 1이 μžˆμœΌλ―€λ‘œ 1을 μŠ€νƒμ— μ‚½μž…ν•œλ‹€. μŠ€νƒμ— μ‚½μž…λœ 1은 λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.

β‘’ ν˜„μž¬ μŠ€νƒμ˜ μ΅œμƒλ‹¨ λ…Έλ“œμΈ 1μ—λŠ” λ°©λ¬Έν•˜μ§€ μ•Šμ€ 인접 λ…Έλ“œ 2, 3이 μžˆλ‹€. 이 쀑 κ°€μž₯ μž‘μ€ λ…Έλ“œμΈ 2λ₯Ό μŠ€νƒμ— λ„£κ³  λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.

β‘£ ν˜„μž¬ μŠ€νƒμ˜ μ΅œμƒλ‹¨ λ…Έλ“œμΈ 2μ—λŠ” λ°©λ¬Έν•˜μ§€ μ•Šμ€ 3κ³Ό 4κ°€ μžˆλ‹€. 이 쀑 κ°€μž₯ μž‘μ€ λ…Έλ“œμΈ 3을 μŠ€νƒμ— λ„£κ³  λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.

β‘€ ν˜„μž¬ μŠ€νƒμ˜ μ΅œμƒλ‹¨ λ…Έλ“œμΈ 3μ—λŠ” λ°©λ¬Έν•˜μ§€ μ•Šμ€ 4와 5κ°€ μžˆλ‹€. κ·Έ 쀑 κ°€μž₯ μž‘μ€ λ…Έλ“œμΈ 4λ₯Ό μŠ€νƒμ— λ„£κ³  λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.

β‘₯ ν˜„μž¬ μŠ€νƒμ˜ μ΅œμƒλ‹¨ λ…Έλ“œμΈ 4μ—λŠ” λ°©λ¬Έν•˜μ§€ μ•Šμ€ 인접 λ…Έλ“œκ°€ μ—†λ‹€. λ”°λΌμ„œ μŠ€νƒμ—μ„œ 4번 λ…Έλ“œλ₯Ό κΊΌλ‚Έλ‹€.

⑦ ν˜„μž¬ μŠ€νƒμ˜ μ΅œμƒλ‹¨ λ…Έλ“œμΈ 3μ—λŠ” λ°©λ¬Έν•˜μ§€ μ•Šμ€ 인접 λ…Έλ“œ 5κ°€ μžˆλ‹€. 5λ₯Ό μŠ€νƒμ— λ„£κ³  λ°©λ¬Έ μ²˜λ¦¬ν•œλ‹€.

μ΄λŸ°μ‹μœΌλ‘œ 계속 λ°˜λ³΅ν•˜λ©΄ 좜λ ₯ κ²°κ³ΌλŠ” ❹❽❻❼❺❸❷❢⓿. 

BFSμ—μ„œλŠ” 인접 λ…Έλ“œλ₯Ό λͺ¨λ‘ 큐에 λ„£μ—ˆμ§€λ§Œ, DFSμ—μ„œλŠ” 인접 λ…Έλ“œ 쀑 κ°€μž₯ μž‘μ€ λ…Έλ“œ ν•˜λ‚˜λ§Œ λ„£λŠ”λ‹€. 그리고 λΉΌλ‚΄λ©΄μ„œ 인접 λ…Έλ“œλ₯Ό νƒμƒ‰ν•˜λŠ” 것이 μ•„λ‹ˆλΌ, μŠ€νƒμ— λ“€μ–΄μžˆλŠ” μ΅œμƒλ‹¨ λ…Έλ“œμ˜ 인접 λ…Έλ“œκ°€ 더 이상 없을 λ•Œ λΉΌλ‚Έλ‹€. 


문제 풀이

 

 

1260번: DFS와 BFS

첫째 쀄에 μ •μ μ˜ 개수 N(1 ≤ N ≤ 1,000), κ°„μ„ μ˜ 개수 M(1 ≤ M ≤ 10,000), 탐색을 μ‹œμž‘ν•  μ •μ μ˜ 번호 Vκ°€ μ£Όμ–΄μ§„λ‹€. λ‹€μŒ M개의 μ€„μ—λŠ” 간선이 μ—°κ²°ν•˜λŠ” 두 μ •μ μ˜ λ²ˆν˜Έκ°€ μ£Όμ–΄μ§„λ‹€. μ–΄λ–€ 두 정점 사

www.acmicpc.net

728x90