λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

DFS μ•Œκ³ λ¦¬μ¦˜ (Depth First Search)

by 5566 2023. 10. 11.

1. DFS μ•Œκ³ λ¦¬μ¦˜μ˜ κ°œλ…κ³Ό μž‘λ™ 방식

DFS (Depth First Search) μ•Œκ³ λ¦¬μ¦˜μ€ κ·Έλž˜ν”„λ₯Ό νƒμƒ‰ν•˜λŠ” 방법 쀑 ν•˜λ‚˜λ‘œ, ν˜„μž¬ μ •μ μ—μ„œ 더 이상 갈 수 μžˆλŠ” 정점이 없을 λ•ŒκΉŒμ§€ 깊이 μš°μ„ μœΌλ‘œ νƒμƒ‰ν•˜μ—¬ λͺ¨λ“  정점을 λ°©λ¬Έν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€. DFSλŠ” μŠ€νƒ λ˜λŠ” μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

DFS μ•Œκ³ λ¦¬μ¦˜μ€ λ‹€μŒκ³Ό 같은 μž‘λ™ 방식을 κ°–μŠ΅λ‹ˆλ‹€:

  1. μ‹œμž‘ 정점을 λ°©λ¬Έν•˜κ³ , ν•΄λ‹Ή 정점을 μŠ€νƒμ— λ„£μŠ΅λ‹ˆλ‹€.
  2. μŠ€νƒμ΄ λΉ„μ–΄ μžˆμ§€ μ•Šμ„ λ™μ•ˆ λ‹€μŒμ„ λ°˜λ³΅ν•©λ‹ˆλ‹€:
    1. μŠ€νƒμ˜ κ°€μž₯ μœ„μ— μžˆλŠ” 정점을 κΊΌλ‚΄μ–΄ ν˜„μž¬ μ •μ μœΌλ‘œ μ„€μ •ν•©λ‹ˆλ‹€.
    2. ν˜„μž¬ 정점과 μΈμ ‘ν•œ 정점 쀑 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ€ 정점이 μžˆλ‹€λ©΄, ν•΄λ‹Ή 정점을 λ°©λ¬Έν•˜κ³  μŠ€νƒμ— λ„£μŠ΅λ‹ˆλ‹€.
    3. λͺ¨λ“  μΈμ ‘ν•œ 정점을 λ°©λ¬Έν•œ 경우, μŠ€νƒμ—μ„œ ν˜„μž¬ 정점을 μ‚­μ œν•©λ‹ˆλ‹€.
  3. μŠ€νƒμ΄ λΉ„μ–΄μžˆμœΌλ©΄ λͺ¨λ“  정점을 λ°©λ¬Έν•œ κ²ƒμž…λ‹ˆλ‹€.

DFS μ•Œκ³ λ¦¬μ¦˜μ€ μŠ€νƒμ„ μ΄μš©ν•˜κΈ° λ•Œλ¬Έμ—, κ°€μž₯ λ§ˆμ§€λ§‰μ— 넣은 정점을 λ¨Όμ € μ²˜λ¦¬ν•˜λ―€λ‘œ 깊이 μš°μ„ μœΌλ‘œ νƒμƒ‰ν•˜λŠ” νŠΉμ§•μ„ κ°€μ§€κ²Œ λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 탐색 λ°©μ‹μœΌλ‘œ 인해, ν•œ μ •μ μ—μ„œ μΈμ ‘ν•œ μ •μ μœΌλ‘œ μ΅œλŒ€ν•œ 깊게 νƒμƒ‰ν•˜κ²Œ λ©λ‹ˆλ‹€.

2. DFS μ•Œκ³ λ¦¬μ¦˜μ˜ μ‘μš© 사둀

DFS μ•Œκ³ λ¦¬μ¦˜μ€ κ·Έλž˜ν”„ 탐색에 주둜 μ‚¬μš©λ˜λ©°, λ‹€μ–‘ν•œ μ‘μš© 사둀가 μžˆμŠ΅λ‹ˆλ‹€. λͺ‡ 가지 λŒ€ν‘œμ μΈ μ‘μš© μ‚¬λ‘€λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€:

  1. κ·Έλž˜ν”„ 순회: DFSλŠ” κ·Έλž˜ν”„μ˜ λͺ¨λ“  정점을 νƒμƒ‰ν•˜λŠ”λ° μ‚¬μš©λ©λ‹ˆλ‹€. κ·Έλž˜ν”„κ°€ μ—°κ²°λ˜μ–΄ μžˆμ„ λ•Œ, DFSλ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ¨λ“  정점을 λ°©λ¬Έν•˜κ³  μ—°κ²°λœ λͺ¨λ“  경둜λ₯Ό 탐색할 수 μžˆμŠ΅λ‹ˆλ‹€.

  2. 미둜 μ°ΎκΈ°: DFS μ•Œκ³ λ¦¬μ¦˜μ€ λ―Έλ‘œμ—μ„œ κ°€μž₯ λΉ λ₯Έ 경둜λ₯Ό μ°ΎλŠ”λ° μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. μ‹œμž‘μ λΆ€ν„° DFSλ₯Ό μ΄μš©ν•΄ 갈 수 μžˆλŠ” 경둜λ₯Ό νƒμƒ‰ν•˜λ‹€κ°€ 도착점에 λ„λ‹¬ν•˜λ©΄ 탐색을 μ’…λ£Œν•˜κ³  μ΅œλ‹¨ 경둜λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

  3. μ„œλ‘œ μ—°κ²°λœ ꡬ성 μš”μ†Œ μ°ΎκΈ°: κ·Έλž˜ν”„μ—μ„œ μ„œλ‘œ μ—°κ²°λœ ꡬ성 μš”μ†Œλ₯Ό μ°ΎλŠ”λ° DFSλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‹œμž‘μ μ—μ„œ DFSλ₯Ό μˆ˜ν–‰ν•˜μ—¬ ν•΄λ‹Ή ꡬ성 μš”μ†Œμ— μ†ν•˜λŠ” λͺ¨λ“  정점을 λ°©λ¬Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  4. μœ„μƒ μ •λ ¬: DFS μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ λ°©ν–₯ κ·Έλž˜ν”„μ˜ 정점듀을 μœ„μƒ μˆœμ„œλ‘œ λ‚˜μ—΄ν•˜λŠ” μœ„μƒ 정렬을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν™œμš©ν•˜μ—¬ μš°μ„ μˆœμœ„ μž‘μ—…μ˜ μ‹€ν–‰ μˆœμ„œλ₯Ό κ²°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  5. 사이클 탐지: DFSλ₯Ό μ‚¬μš©ν•˜μ—¬ κ·Έλž˜ν”„μ—μ„œ 사이클을 탐지할 수 μžˆμŠ΅λ‹ˆλ‹€. 정점을 λ°©λ¬Έν•˜λŠ” κ³Όμ •μ—μ„œ 이미 λ°©λ¬Έν•œ 정점을 λ§Œλ‚˜λ©΄ 사이클이 μ‘΄μž¬ν•˜λŠ” κ²ƒμœΌλ‘œ νŒλ‹¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 사이클을 νƒμ§€ν•˜λŠ” 것은 κ·Έλž˜ν”„μ˜ μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜λŠ”λ° μœ μš©ν•©λ‹ˆλ‹€.

이 외에도 DFSλŠ” κ·Έλž˜ν”„ 문제뿐만 μ•„λ‹ˆλΌ 미둜 κ²Œμž„, μž¬κ·€μ μΈ 문제 ν•΄κ²° λ“± λ‹€μ–‘ν•œ μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œμ—μ„œ ν™œμš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. DFSλŠ” κ·Έλž˜ν”„ ꡬ쑰에 따라 깊이 μš°μ„ μœΌλ‘œ νƒμƒ‰ν•˜λŠ” νŠΉμ§•μ„ 가지고 있기 λ•Œλ¬Έμ—, 탐색 문제뿐만 μ•„λ‹ˆλΌ μ—¬λŸ¬ μ’…λ₯˜μ˜ λ¬Έμ œμ— μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

3. DFS μ•Œκ³ λ¦¬μ¦˜μ˜ μž₯단점

DFS μ•Œκ³ λ¦¬μ¦˜μ€ λ‹€μŒκ³Ό 같은 μž₯점과 단점을 κ°–μŠ΅λ‹ˆλ‹€.

μž₯점:

  • κ΅¬ν˜„μ΄ κ°„λ‹¨ν•˜λ©°, μŠ€νƒ λ˜λŠ” μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이둜 인해 μ½”λ“œκ°€ κ°„κ²°ν•˜κ³  μ§κ΄€μ μž…λ‹ˆλ‹€.

  • 깊이 μš°μ„  탐색이기 λ•Œλ¬Έμ—, μ‹œμž‘μ μœΌλ‘œλΆ€ν„° μ΅œλŒ€ν•œ 깊게 νƒμƒ‰ν•˜κΈ° λ•Œλ¬Έμ— κ°€λŠ₯ν•œ λΉ λ₯΄κ²Œ 해닡에 도달할 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, μ΅œλ‹¨ 경둜 찾기와 같은 λ¬Έμ œμ— μ ν•©ν•©λ‹ˆλ‹€.

단점:

  • κ·Έλž˜ν”„κ°€ λ¬΄ν•œνžˆ κΉŠμ–΄μ§ˆ 수 μžˆλŠ” 경우, 탐색이 λλ‚˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, λ©”λͺ¨λ¦¬ λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • BFS보닀 νŠΉμ • 경둜λ₯Ό μ°ΎκΈ° μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€. DFSλŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ 경둜λ₯Ό νƒμƒ‰ν•˜κΈ° λ•Œλ¬Έμ—, 닡이 될 수 μžˆλŠ” λͺ¨λ“  경둜λ₯Ό νƒμƒ‰ν•˜κΈ° μœ„ν•΄ 전체 κ·Έλž˜ν”„λ₯Ό 탐색해야 ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

  • DFSλŠ” λ°±νŠΈλž˜ν‚Ήμ„ μ‚¬μš©ν•˜λŠ” κ²½μš°μ— νš¨κ³Όμ μ΄μ§€λ§Œ, μ΅œμ ν™” λ¬Έμ œμ—λŠ” μ ν•©ν•˜μ§€ μ•Šμ„ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΅œμ ν™” λ¬Έμ œμ—μ„œλŠ” λͺ¨λ“  κ°€λŠ₯ν•œ 경둜λ₯Ό νƒμƒ‰ν•˜λŠ” λŒ€μ‹  νŠΉμ • 기쀀에 따라 κ°€μž₯ 쒋은 경둜λ₯Ό μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

  • DFSλŠ” 깊이 μš°μ„ μœΌλ‘œ νƒμƒ‰ν•˜κΈ° λ•Œλ¬Έμ—, λ™μΌν•œ 정점을 λ°˜λ³΅ν•΄μ„œ λ°©λ¬Έν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 반볡 방문을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ λ°©λ¬Έν•œ 정점을 μ²΄ν¬ν•˜λŠ” 것이 ν•„μš”ν•©λ‹ˆλ‹€.

DFSλŠ” κ΅¬ν˜„μ΄ κ°„λ‹¨ν•˜κ³ , μ΅œλ‹¨ 경둜 μ°ΎκΈ° λ“± 깊이 μš°μ„  탐색에 μ ν•©ν•œ λ¬Έμ œμ—μ„œ νš¨κ³Όμ μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ λ¬΄ν•œ 깊이의 κ·Έλž˜ν”„μ™€ 같이 탐색이 λλ‚˜μ§€ μ•Šμ„ 수 μžˆλŠ” κ²½μš°λ‚˜ μ΅œμ ν™” λ¬Έμ œμ—λŠ” μ œν•œμ μΌ 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μž₯단점을 κ³ λ €ν•˜μ—¬ DFS μ•Œκ³ λ¦¬μ¦˜μ„ μ ν•©ν•œ λ¬Έμ œμ— μ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

4. DFS μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„μ™€ 곡간 λ³΅μž‘λ„

DFS μ•Œκ³ λ¦¬μ¦˜μ˜ μ‹œκ°„ λ³΅μž‘λ„μ™€ 곡간 λ³΅μž‘λ„λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

μ‹œκ°„ λ³΅μž‘λ„:

DFSλŠ” κ·Έλž˜ν”„μ˜ λͺ¨λ“  정점을 ν•œ λ²ˆμ”© λ°©λ¬Έν•˜λŠ”λ° μ‹œκ°„μ΄ κ±Έλ¦½λ‹ˆλ‹€. λ”°λΌμ„œ, κ·Έλž˜ν”„μ˜ λͺ¨λ“  정점을 νƒμƒ‰ν•˜κΈ° μœ„ν•œ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(V) μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ VλŠ” μ •μ μ˜ κ°œμˆ˜μž…λ‹ˆλ‹€.

λ˜ν•œ, DFSλŠ” 각 μ •μ μ—μ„œ μΈμ ‘ν•œ λͺ¨λ“  정점을 λ°©λ¬Έν•˜κΈ° μœ„ν•΄ μΈμ ‘ν•œ 간선을 λͺ¨λ‘ νƒμƒ‰ν•©λ‹ˆλ‹€. λ”°λΌμ„œ, μΈμ ‘ν•œ 정점을 νƒμƒ‰ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ€ ν•΄λ‹Ή μ •μ μ˜ μ°¨μˆ˜μ— λΉ„λ‘€ν•©λ‹ˆλ‹€. λ§Œμ•½, κ·Έλž˜ν”„κ°€ 인접 리슀트둜 ν‘œν˜„λ˜μ–΄ μžˆλ‹€λ©΄, 각 μ •μ μ—μ„œ μΈμ ‘ν•œ 정점을 νƒμƒ‰ν•˜λŠ”λ° O(1)의 μ‹œκ°„μ΄ 걸리며, κ·Έλž˜ν”„μ˜ λͺ¨λ“  간선을 탐색해야 ν•˜λ―€λ‘œ O(E)의 μ‹œκ°„μ΄ μ†Œμš”λ©λ‹ˆλ‹€. μ—¬κΈ°μ„œ EλŠ” κ°„μ„ μ˜ κ°œμˆ˜μž…λ‹ˆλ‹€.

λ”°λΌμ„œ, DFS μ•Œκ³ λ¦¬μ¦˜μ˜ μ΅œμ’… μ‹œκ°„ λ³΅μž‘λ„λŠ” O(V + E)μž…λ‹ˆλ‹€.

곡간 λ³΅μž‘λ„:

DFS μ•Œκ³ λ¦¬μ¦˜μ—μ„œ μ‚¬μš©λ˜λŠ” κ°€μž₯ μ€‘μš”ν•œ 자료 κ΅¬μ‘°λŠ” μŠ€νƒ λ˜λŠ” μž¬κ·€ ν•¨μˆ˜μ˜ 호좜 μŠ€νƒμž…λ‹ˆλ‹€. DFSλŠ” μ‹œμž‘ 정점뢀터 탐색을 μ‹œμž‘ν•˜κ³ , μΈμ ‘ν•œ 정점을 κ³„μ†ν•΄μ„œ μŠ€νƒμ— μΆ”κ°€ν•˜λ©΄μ„œ 탐색을 μ§„ν–‰ν•©λ‹ˆλ‹€. λ”°λΌμ„œ, μŠ€νƒμ—λŠ” μ΅œμ•…μ˜ 경우 μ •μ μ˜ 개수만큼의 μš”μ†Œκ°€ μ €μž₯될 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” κ·Έλž˜ν”„μ˜ κΉŠμ΄μ— 따라 달라지며, μ΅œμ•…μ˜ 경우 λ¬΄ν•œνžˆ κΉŠμ–΄μ§„λ‹€λ©΄ μŠ€νƒμ˜ ν¬κΈ°λŠ” λ¬΄ν•œνžˆ 컀질 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, DFSλŠ” λ°©λ¬Έ μ—¬λΆ€λ₯Ό μ²΄ν¬ν•˜κΈ° μœ„ν•œ λ°°μ—΄μ΄λ‚˜ 리슀트λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 이 배열은 κ·Έλž˜ν”„μ˜ 정점 κ°œμˆ˜μ— λΉ„λ‘€ν•˜λ©°, λͺ¨λ“  정점을 λ°©λ¬Έν•˜κ³  μ²΄ν¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” O(V)의 곡간이 ν•„μš”ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ, DFS μ•Œκ³ λ¦¬μ¦˜μ˜ μ΅œμ’… 곡간 λ³΅μž‘λ„λŠ” O(V)μž…λ‹ˆλ‹€. λ‹€λ§Œ, μ΅œμ•…μ˜ 경우 μŠ€νƒμ΄ λ¬΄ν•œνžˆ 컀진닀면 곡간 λ³΅μž‘λ„λŠ” O(∞)이 될 수 μžˆμŠ΅λ‹ˆλ‹€.

5. DFS μ•Œκ³ λ¦¬μ¦˜μ˜ κ΅¬ν˜„ 방법과 μ£Όμš” μ½”λ“œ μ˜ˆμ‹œ

DFS μ•Œκ³ λ¦¬μ¦˜μ€ μŠ€νƒ λ˜λŠ” μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ κ΅¬ν˜„ 방법에 λŒ€ν•΄ μ„€λͺ…ν•˜κ³ , μ£Όμš” μ½”λ“œ μ˜ˆμ‹œλ₯Ό μ œμ‹œν•˜κ² μŠ΅λ‹ˆλ‹€.

μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ κ΅¬ν˜„ 방법:

  1. μ‹œμž‘ 정점을 λ°©λ¬Έν•˜κ³ , λ°©λ¬Έν•œ 정점을 μ²΄ν¬ν•©λ‹ˆλ‹€.

  2. ν˜„μž¬ 정점과 μΈμ ‘ν•œ 정점 μ€‘μ—μ„œ λ°©λ¬Έν•˜μ§€ μ•Šμ€ 정점을 μž¬κ·€μ μœΌλ‘œ νƒμƒ‰ν•©λ‹ˆλ‹€. μ΄λ•Œ, νƒμƒ‰ν•œ 정점은 λ°©λ¬Έν•œ μ •μ μœΌλ‘œ μ²΄ν¬ν•©λ‹ˆλ‹€.

  3. λͺ¨λ“  μΈμ ‘ν•œ 정점을 νƒμƒ‰ν•œ ν›„μ—λŠ” λ°±νŠΈλž˜ν‚Ήμ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. 즉, ν˜„μž¬ μ •μ μ˜ 탐색을 μ’…λ£Œν•˜κ³  이전 μ •μ μœΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.

  4. μ‹œμž‘ μ •μ μœΌλ‘œλΆ€ν„° 탐색을 μ‹œμž‘ν•˜μ—¬ λͺ¨λ“  정점을 λ°©λ¬Έν•  λ•ŒκΉŒμ§€ 2-3단계λ₯Ό λ°˜λ³΅ν•©λ‹ˆλ‹€.

μ£Όμš” μ½”λ“œ μ˜ˆμ‹œ:

λ‹€μŒμ€ μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ DFS μ•Œκ³ λ¦¬μ¦˜μ˜ μ£Όμš” μ½”λ“œ μ˜ˆμ‹œμž…λ‹ˆλ‹€. 이 μ˜ˆμ‹œμ—μ„œλŠ” 인접 리슀트둜 ν‘œν˜„λœ κ·Έλž˜ν”„λ₯Ό κΈ°μ€€μœΌλ‘œ μ„€λͺ…ν•©λ‹ˆλ‹€.

def dfs(vertex, visited, graph):
    # ν˜„μž¬ 정점 λ°©λ¬Έ
    visited[vertex] = True
    print(vertex, end=' ')

    # ν˜„μž¬ 정점과 μΈμ ‘ν•œ 정점듀에 λŒ€ν•΄ μž¬κ·€ 호좜
    for adjacent_vertex in graph[vertex]:
        if not visited[adjacent_vertex]:
            dfs(adjacent_vertex, visited, graph)

# κ·Έλž˜ν”„ 정보
graph = {
    1: [2, 3],
    2: [1, 4, 5],
    3: [1, 6, 7],
    4: [2],
    5: [2],
    6: [3],
    7: [3]
}

# μ •μ μ˜ 개수
num_vertices = len(graph)

# λ°©λ¬Έ μ—¬λΆ€λ₯Ό μ²΄ν¬ν•˜κΈ° μœ„ν•œ λ°°μ—΄
visited = [False] * (num_vertices + 1)

# DFS 호좜
dfs(1, visited, graph)

μœ„μ˜ μ½”λ“œ μ˜ˆμ‹œμ—μ„œλŠ” dfs ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜μ—¬ DFS μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  • 첫 번째 인자인 vertexλŠ” ν˜„μž¬ νƒμƒ‰ν•˜λŠ” 정점을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • 두 번째 인자인 visitedλŠ” λ°©λ¬Έ μ—¬λΆ€λ₯Ό μ²΄ν¬ν•˜κΈ° μœ„ν•œ λ°°μ—΄λ‘œ, μ •μ μ˜ κ°œμˆ˜λ³΄λ‹€ ν•˜λ‚˜ 더 크게 ν• λ‹Ήν•©λ‹ˆλ‹€.
  • μ„Έ 번째 인자인 graphλŠ” 인접 리슀트 ν˜•νƒœμ˜ κ·Έλž˜ν”„ 정보λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.

dfs ν•¨μˆ˜μ—μ„œλŠ” ν˜„μž¬ 정점을 λ°©λ¬Έν•˜κ³  μ²΄ν¬ν•œ λ’€, μΈμ ‘ν•œ 정점을 μž¬κ·€μ μœΌλ‘œ νƒμƒ‰ν•©λ‹ˆλ‹€. μ΄λ•Œ, λ°©λ¬Έν•˜μ§€ μ•Šμ€ 정점에 λŒ€ν•΄μ„œλ§Œ 탐색을 μ§„ν–‰ν•©λ‹ˆλ‹€. 그리고 각 정점을 νƒμƒ‰ν•œ ν›„μ—λŠ” λ°±νŠΈλž˜ν‚Ήμ„ μˆ˜ν–‰ν•˜μ—¬ 이전 μ •μ μœΌλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€.

μœ„μ˜ μ½”λ“œ μ˜ˆμ‹œλ₯Ό μ‹€ν–‰ν•˜λ©΄, μ‹œμž‘ μ •μ μ—μ„œλΆ€ν„° DFS 탐색을 μ‹œμž‘ν•˜μ—¬ κ·Έλž˜ν”„μ˜ λͺ¨λ“  정점을 λ°©λ¬Έν•˜λŠ” μˆœμ„œλŒ€λ‘œ 좜λ ₯λ©λ‹ˆλ‹€.

λŒ“κΈ€