[μ•Œκ³ λ¦¬μ¦˜] Breadth-First Search(BFS) - λ„ˆλΉ„ μš°μ„  탐색 & Depth-First Search(DFS) - 깊이 μš°μ„  탐색

2021. 9. 28. 08:00ㆍ코딩 ν…ŒμŠ€νŠΈ μ€€λΉ„/μ•Œκ³ λ¦¬μ¦˜

728x90
λ°˜μ‘ν˜•

μ•ˆλ…•ν•˜μ„Έμš”? μ£Όλ‹ˆν•˜λž‘ μž…λ‹ˆλ‹€.

μ˜€λŠ˜μ€ μ•Œκ³ λ¦¬μ¦˜μ˜ BFS(λ„ˆλΉ„ μš°μ„  탐색)와 DFS(깊이 μš°μ„  탐색)에 λŒ€ν•΄μ„œ κ³΅λΆ€ν•˜λŠ” μ‹œκ°„μΈ κ²ƒμ΄μ—μš”.

μ˜€λŠ˜λ„ ν™”μ΄νŒ…μΈ κ²ƒμ΄μ—μš”!

μ†ŒμŠ€ μ½”λ“œμ— λŒ€ν•΄μ„œ 확인 ν•˜κ³  μ‹ΆμœΌμ‹  λΆ„λ“€κ»˜μ„œλŠ” μ£Όλ‹ˆν•˜λž‘μ˜ Git hub에 관심을 μ£Όμ„Έμš”!

 

 

 





πŸ“Œ BFS와 DFSλž€?


이 λ‘˜μ€ λŒ€ν‘œμ μΈ Graph 탐색 μ•Œκ³ λ¦¬μ¦˜μΈ κ²ƒμ΄μ—μš”.

λ„ˆλΉ„ μš°μ„  탐색은 정점듀과 같은 λ ˆλ²¨μ— μžˆλŠ” Node(ν˜•μ œ Node)듀을 λ¨Όμ € νƒμƒ‰ν•˜λŠ” 방식인 κ²ƒμ΄μ—μš”.

깊이 μš°μ„  탐색은 μ •μ μ˜ μžμ‹ Nodeλ₯Ό λ¨Όμ € νƒμƒ‰ν•˜λŠ” 방식인 κ²ƒμ΄μ—μš”.

 

 

  πŸ“BFS / DFS 이해λ₯Ό μœ„ν•œ 예제

 

좜처 : 패슀트 캠퍼슀 - μ•Œκ³ λ¦¬μ¦˜ κΈ°μˆ λ©΄μ ‘ μ™„μ „ 정볡

 

λ¨Όμ € BFS 방식은 A - B - C - D - G - H - I - E -F -J 순으둜 탐색을 ν•˜λŠ” κ²ƒμ΄μ—μš”.

ν•œ 단계식 λ‚΄λ €κ°€λ©΄μ„œ, ν•΄λ‹Ή Node와 같은 Level ν˜Ήμ€ 높이에 μžˆλŠ” Node(ν˜•μ œ Node)듀을 λ¨Όμ € νƒμƒ‰ν•˜κ²Œ λ˜λŠ” κ²ƒμ΄μ—μš”.

DFS 방식은 A - B -D -E - F -C -G - H - I -J 순으둜 탐색을 ν•˜λŠ” κ²ƒμ΄μ—μš”.

ν•œ Node의 μžμ‹κ³Ό μ†μžλ₯Ό 쭈~욱 타고 λκΉŒμ§€ 탐색을 ν•œ 뒀에 λ‹€μ‹œ κ·Έ λ‹€μŒ μœ„λ‘œ μ˜¬λΌμ™€μ„œ λ‹€λ₯Έ ν˜•μ œ Nodeλ“€μ˜ μžμ‹ Nodeλ₯Ό 타고 쭈~욱 λ‚΄λ €κ°€λ©΄μ„œ 탐색을 ν•œλ‹΅λ‹ˆλ‹€!

 

 

πŸ“Œ 파이썬으둜 κ·Έλž˜ν”„ ν‘œν˜„ 방법


νŒŒμ΄μ¬μ—μ„œ μ œκ³΅ν•˜λŠ” λ”•μ…”λ„ˆλ¦¬μ™€ 리슀트 자료 ꡬ쑰λ₯Ό ν™œμš©ν•˜μ—¬ κ·Έλž˜ν”„λ₯Ό ν‘œν˜„ν•  수 μžˆλ‹΅λ‹ˆλ‹€!

 

 

 

  πŸ“κ·Έλž˜ν”„ μ˜ˆμ™€ 파이썬 ν‘œν˜„

 

λ°˜μ‘ν˜•

 

μœ„μ˜ μ½”λ“œμ²˜λŸΌ λ”•μ…”λ„ˆλ¦¬ νƒ€μž…μ˜ λ³€μˆ˜λ₯Ό μ„ μ–Έν•œ λ‹€μŒ Key와 Valueλ₯Ό μ΄μš©ν•˜μ—¬ λ‹€μŒκ³Ό 같이 κ·Έλž˜ν”„λ₯Ό λ§Œλ“œλŠ” κ²ƒμ΄μ—μš”.

 

μ½”λ“œ μ‹€ν–‰ κ²°κ³Ό

 

 

 

 

πŸ“Œ BFS μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„


μžλ£Œκ΅¬μ‘°λ‘œλŠ” 큐(First In First Out)λ₯Ό ν™œμš©ν•  수 μžˆλŠ” κ²ƒμ΄μ—μš”.

이것을 μœ„ν•΄ need_visit 큐와 visited 큐 λ‘κ°œλ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν•  κ²ƒμ΄μ—μš”.

 

좜처 : 패슀트 캠퍼슀 - μ•Œκ³ λ¦¬μ¦˜ κΈ°μˆ λ©΄μ ‘ μ™„μ „ 정볡

 

μ—¬κΈ°μ„œ 큐의 κ΅¬ν˜„μ€ 파이썬의 리슀트λ₯Ό ν™œμš©ν•  μˆ˜λ„ μžˆλ‹΅λ‹ˆλ‹€!

 

ν•¨μˆ˜ λ‚΄μš©

 

 

ν•¨μˆ˜ 호좜

 

 

μ½”λ“œ μ‹€ν–‰ κ²°κ³Ό

 

 

 

좜처 : 패슀트 캠퍼슀 - μ•Œκ³ λ¦¬μ¦˜ κΈ°μˆ λ©΄μ ‘ μ™„μ „ 정볡

 

 

 

 

πŸ“Œ DFS μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„


좜처 : 패슀트 캠퍼슀 - μ•Œκ³ λ¦¬μ¦˜ κΈ°μˆ λ©΄μ ‘ μ™„μ „ 정볡

 

DFSλŠ” 자료ꡬ쑰둜 μŠ€νƒκ³Ό 큐λ₯Ό μ‚¬μš©ν•  κ²ƒμ΄μ—μš”.

λ¨Όμ € need_visit은 μŠ€νƒμ„ μ‚¬μš©ν•˜κ³ , visitedλŠ” 큐λ₯Ό μ‚¬μš©ν•˜λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

BFSλŠ” 두 개의 큐λ₯Ό μ‚¬μš©ν–ˆμ§€λ§Œ, DFSλŠ” 큐와 μŠ€νƒμ„ μ‚¬μš©ν•œλ‹€λŠ” κ±° 잊으면 μ•ˆλ˜λŠ” κ²ƒμ΄μ—μš”!

 

μ•„ μ°Έ! 큐와 μŠ€νƒ κ΅¬ν˜„μ€ 별도 라이브러리λ₯Ό ν™œμš©ν•  μˆ˜λ„ μžˆμ§€λ§Œ, κ°„λ‹¨νžˆ Listλ₯Ό ν™œμš©ν•  μˆ˜λ„ μžˆλŠ” κ²ƒμ΄μ—μš”.

 

 

 

 

 

κ²°κ³Ό ν™”λ©΄

 

 

 

πŸ“Œ μ‹œκ°„ λ³΅μž‘λ„


일반적으둜 BFS와 DFS의 μ‹œκ°„ λ³΅μž‘λ„λŠ” μ•„λž˜μ™€ 같이 κ³„μ‚°ν•˜λŠ” κ²ƒμ΄μ—μš”.

Node의 수λ₯Ό V (Vertex )라 ν•˜κ³ , κ°„μ„  수λ₯Ό E(Edge)라고 ν•  λ•Œ, μœ„ Codeμ—μ„œ while need_visit은 V + E 만큼 μˆ˜ν–‰ν•˜λŠ” κ²ƒμ΄μ—μš”.

κ²°κ΅­ λΉ…μ˜€ ν‘œκΈ°λ²•μœΌλ‘œλŠ” O(V + E)κ°€ λ˜λŠ” κ²ƒμ΄μ—μš”.

 

πŸ’‘μ°Έκ³  :
BFSλ‚˜, DFS ν˜Ήμ€ κ·Έλž˜ν”„λ“€μ€ μž…λ ₯이 ν•˜λ‚˜λ§Œ μžˆλŠ” 것(N)κ³Ό 달리 Node와 Link(κ°„μ„ )이 μž…λ ₯이 λœλ‹€.
κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λ‹€λ₯Έ 것듀은 λΉ…μ˜€ ν‘œκΈ°λ²•μ΄ O(N) λ“±κ³Ό 같이 N을 μ“°λ‚˜, κ·Έλž˜ν”„λŠ” V와 Eλ₯Ό μ‚¬μš©ν•œλ‹€.

 

 

좜처 : 패슀트 캠퍼슀 - 이쀀희 κ°•μ‚¬λ‹˜μ˜ μ•Œκ³ λ¦¬μ¦˜ / κΈ°μˆ λ©΄μ ‘ μ™„μ „ 정볡 μ˜¬μΈμ› νŒ¨ν‚€μ§€ Online

이 글은 κ°•μ˜ λ‚΄μš©κ³Ό κ°•μ˜ 자료λ₯Ό λ°”νƒ•μœΌλ‘œ 'μ£Όλ‹ˆν•˜λž‘'이 'μ£Όλ‹ˆν•˜λž‘' μ΄ν•΄ν•˜κΈ° 쉽기 μœ„ν•΄ μž‘μ„±ν•œ λ‚΄μš© μž„μ„ μ•Œλ €λ“œλ¦½λ‹ˆλ‹€.

 

 


 

 



 

μ£Όλ‹ˆν•˜λž‘μ˜ 글이 λ§ˆμŒμ— λ“œμ…¨λ‚˜μš”? ꡬ독과 곡감! 그리고, λŒ“κΈ€ 그리고 λ°©λͺ…둝은 μ£Όλ‹ˆν•˜λž‘μ—κ²Œ λ§Žμ€ 힘이 λ©λ‹ˆλ‹€

728x90
λ°˜μ‘ν˜•