Skip to content

[Note] κ·Έλž˜ν”„λ₯Ό μ•Œμ•„λ³΄μžΒ #8

@saseungmin

Description

@saseungmin

πŸ“š μ‰½κ²Œ λ°°μš°λŠ” μ•Œκ³ λ¦¬μ¦˜ μ±… Chapter 10: κ·Έλž˜ν”„

🎈 κ·Έλž˜ν”„μ˜ ν‘œν˜„

  • 인접 ν–‰λ ¬
    • ν–‰λ ¬ ν‘œν˜„λ²•μ€ μ΄ν•΄ν•˜κΈ° 쉽고 κ°„μ„ μ˜ 쑴재 μ—¬λΆ€λ₯Ό 즉각 μ•Œ 수 μžˆλ‹€λŠ” μž₯점이 μžˆλ‹€.
    • λŒ€μ‹  n x n 행렬이 ν•„μš”ν•˜λ―€λ‘œ n2에 λΉ„λ‘€ν•˜λŠ” 곡간이 ν•„μš”ν•˜κ³ , ν–‰λ ¬μ˜ μ€€λΉ„ κ³Όμ •μ—μ„œ ν–‰λ ¬μ˜ λͺ¨λ“  μ›μ†Œλ₯Ό μ±„μš°λŠ” 데만 n2에 λΉ„λ‘€ν•˜λŠ” μ‹œκ°„μ΄ λ“ λ‹€. κ·ΈλŸ¬λ―€λ‘œ O(n2) 미만의 μ‹œκ°„μ΄ μ†Œμš”λ˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄ ν•„μš”ν•œ κ²½μš°μ— ν–‰λ ¬ ν‘œν˜„λ²•μ„ μ‚¬μš©ν•˜λ©΄ ν–‰λ ¬μ˜ μ€€λΉ„ κ³Όμ •μ—μ„œλ§Œ Ι΅(n2)의 μ‹œκ°„μ„ μ†Œλͺ¨ν•΄λ²„λ € μ μ ˆν•˜μ§€ μ•Šλ‹€.
    • κ°„μ„­μ˜ 밀도가 μ•„μ£Ό 높은 κ·Έλž˜ν”„μ—μ„œλŠ” 인접 ν–‰λ ¬ ν‘œν˜„μ΄ μ ν•©ν•˜λ‹€.
    • JavaScript 예제
  • 인접 리슀트
    • 인접 λ¦¬μŠ€νŠΈλŠ” 곡간이 κ°„μ„ μ˜ μ΄μˆ˜μ— λΉ„λ‘€ν•˜λŠ” μ–‘λ§ŒνΌ ν•„μš”ν•˜λ―€λ‘œ λŒ€μ²΄λ‘œ ν–‰λ ¬ ν‘œν˜„μ— λΉ„ν•΄ κ³΅κ°„μ˜ λ‚­λΉ„κ°€ μ—†λ‹€. λͺ¨λ“  κ°€λŠ₯ν•œ 정점 μŒμ— λΉ„ν•΄ κ°„μ„ μ˜ μˆ˜κ°€ 적을 λ–„ μœ μš©ν•˜λ‹€. ν•˜μ§€λ§Œ, 거의 λͺ¨λ“  정점 μŒμ— λŒ€ν•΄ 간선이 μ‘΄μž¬ν•˜λŠ” κ²½μš°μ—λŠ” 였히렀 리슀트λ₯Ό λ§Œλ“œλŠ” 데 ν•„μš”ν•œ μ˜€λ²„ν—€λ“œλ§Œ 더 λ“ λ‹€. κ·Έλž˜μ„œ κ°„μ„ μ˜ 밀도가 높은 κ²½μš°μ—λŠ” μ ν•©ν•˜μ§€ μ•Šλ‹€.
    • JavaScript 예제

🎈 λ„ˆλΉ„ μš°μ„  탐색(BFS)κ³Ό 깊이 μš°μ„  탐색(DFS)

  • BFS
    • BFSλŠ” λ¨Όμ € 루트의 μžμ‹μ„ μ°¨λ‘€λ‘œ λ°©λ¬Έν•œλ‹€. λ‹€μŒμœΌλ‘œ 루트 μžμ‹μ˜ μžμ‹, 즉 λ£¨νŠΈμ—μ„œ 두 개의 간선을 κ±°μ³μ„œ 도달할 수 μžˆλŠ” 정점을 λ°©λ¬Έν•œλ‹€.
    • BFS의 μˆ˜ν–‰ μ‹œκ°„μ€ Ι΅(V + E)이닀
    • 경주둜 건섀: 2020 카카였 인턴쉽
  • DFS
    • DFSλŠ” 루트의 μžμ‹ 정점을 ν•˜λ‚˜ λ°©λ¬Έν•œ λ‹€μŒ μ•„λž˜λ‘œ λ‚΄κ²¨κ°ˆ 수 μžˆλŠ” κ³³κΉŒμ§€ λ‚΄λ €κ°„λ‹€. 더 이상 λ‚΄λ €κ°ˆ μˆ˜κ°€ μ—†μœΌλ©΄ μœ„λ‘œ λ˜λŒμ•„μ˜€λ‹€κ°€ λ‚΄κ²¨κ°ˆ 곳이 있으면 즉각 λ‚΄λ €κ°„λ‹€.
    • DFS의 μˆ˜ν–‰μ‹œκ°„μ€ Ι΅(V + E)이닀.
  • DFS & BFS JavaScript 문제 예제

🎈 μ΅œμ†Œ μ‹ μž₯ 트리

  • ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜
    • ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜μ€ μ§‘ν•© Sλ₯Ό κ³΅μ§‘ν•©μ—μ„œ μ‹œμž‘ν•˜μ—¬ λͺ¨λ“  정점을 포함할 λ•ŒκΉŒμ§€(즉, S=Vκ°€ λ λ•ŒκΉŒμ§€) ν‚€μ›Œλ‚˜κ°„λ‹€. 맨 처음 정점을 μ œμ™Έν•˜κ³ λŠ” 정점을 ν•˜λ‚˜ 더할 λ•Œλ§ˆλ‹€ 간선이 ν•˜λ‚˜μ”© ν™•μ •λœλ‹€.
    • ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜μ˜ μˆ˜ν–‰ μ‹œκ°„μ€ μ΅œμ†Œνž™μ„ μ‚¬μš©ν–ˆμ„ λ•Œ O(ElogV)이닀.
  • 크루슀칼 μ•Œκ³ λ¦¬μ¦˜
    • 크루슀칼(Kruskal) μ•Œκ³ λ¦¬μ¦˜μ€ 사이클을 λ§Œλ“€μ§€ μ•ŠλŠ” λ²”μœ„μ—μ„œ μ΅œμ†Œ λΉ„μš© 간선을 ν•˜λ‚˜μ”© λ”ν•΄κ°€λ©΄μ„œ μ΅œμ†Œ μ‹ μž₯ 트리λ₯Ό λ§Œλ“ λ‹€.
    • 크루슀칼 μ•Œκ³ λ¦¬μ¦˜μ˜ μˆ˜ν–‰ μ‹œκ°„μ€ O(ElogV)이닀.
  • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ 섬 μ—°κ²°ν•˜κΈ° 문제λ₯Ό 크루슀칼과 ν”„λ¦Ό μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄ 문제 풀이

🎈 μœ„μƒ μ •λ ¬

  • μž‘μ—… i와 μž‘μ—… j 사이에 κ°„μ„  (i, j)κ°€ μ‘΄μž¬ν•œλ‹€λ©΄ μž‘μ—… iλŠ” λ°˜λ“œμ‹œ μž‘μ—… j보닀 λ¨Όμ € μˆ˜ν–‰λœλ‹€. λͺ¨λ“  간선에 λŒ€ν•΄μ„œ 이 μ„±μ§ˆλ§Œ λ§Œμ‘±ν•˜λ©΄ μ–΄λ–€ μˆœμ„œλΌλ„ μ’‹λ‹€. μ΄λŸ¬ν•œ μ„±μ§ˆμ„ λ§Œμ‘±ν•˜λŠ” 정렬을 μœ„μƒ 정렬이라 ν•œλ‹€.
  • κ°„μ„ (i, j)κ°€ μ‘΄μž¬ν•˜λ©΄ μ •λ ¬ κ²°κ³Όμ—μ„œ 정점 iλŠ” λ°˜λ“œμ‹œ 정점 j보닀 μ•žμ— μœ„μΉ˜ν•΄μ•Ό ν•œλ‹€.
  • λ§Œμ•½ κ·Έλž˜ν”„μ— 사이클이 μžˆλ‹€λ©΄ 이 μ„±μ§ˆμ€ κ²°μ½” 만쑱될 수 μ—†μœΌλ―€λ‘œ μœ„μƒ 정렬은 ν•  수 μ—†λ‹€.
  • μœ„μƒ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μ˜ μˆ˜ν–‰ μ‹œκ°„μ€ for λ£¨ν”„λŠ” n번 λ°˜λ³΅λœλ‹€. λ§€ 반볡 λ•Œλ§ˆλ‹€ 1개의 정점이 μ„ νƒλ˜κ³  ν•΄λ‹Ή 정점이 μ—°κ²°λœ μ§„μΆœ 간선이 λͺ¨λ‘ μ œκ±°λœλ‹€. 각 간선은 단 ν•œ λ²ˆμ”©λ§Œ μ·¨κΈ‰λœλ‹€. κ·ΈλŸ¬λ―€λ‘œ 총 μˆ˜ν–‰ μ‹œκ°„μ€ Ι΅(V + E)이닀.

🎈 μ΅œλ‹¨ 경둜

  • λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜
  • 벨만-ν¬λ“œ μ•Œκ³ λ¦¬μ¦˜
    • 음의 κ°€μ€‘μΉ˜κ°€ μ‘΄μž¬ν•˜λŠ” 경우둜. 벨만-ν¬λ“œ μ•Œκ³ λ¦¬μ¦˜μ΄ 이 μœ ν˜•μ˜ 문제λ₯Ό ν‘Όλ‹€. (음의 κ°€μ€‘μΉ˜λŠ” ν—ˆμš©ν•˜μ§€λ§Œ κ°€μ€‘μΉ˜ 합이 음인 사이클은 μ ˆλŒ€ ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.)
    • 벨만-ν¬λ“œ μ•Œκ³ λ¦¬μ¦˜μ€ 음의 사이클이 μ‘΄μž¬ν•˜λ©΄ 문제 μžμ²΄κ°€ μ„±λ¦½λ˜μ§€ μ•ŠλŠ”λ‹€.
    • 벨만-ν¬λ“œ μ•Œκ³ λ₯΄μ¦˜μ„ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” 곳에 λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜λ©΄ μ œλŒ€λ‘œ ν•΄λ₯Ό κ΅¬ν•˜μ§€ λͺ»ν•œλ‹€. λ°˜λŒ€λ‘œ λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄ ν•΄λ₯Ό ꡬ할 수 μžˆλŠ” κ²½μš°μ—λŠ” 항상 벨만-ν¬λ“œ μ•Œκ³ λ¦¬μ¦˜μ„ 써도 λœλ‹€. κ·ΈλŸ¬λ‚˜ 벨만 ν¬λ“œ μ•Œκ³ λ¦¬μ¦˜μ€ O(ElogV) μ‹œκ°„μ΄ μ†Œμš”λ˜λŠ” λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ— λΉ„ν•΄ μ‹œκ°„μ΄ 많이 κ±Έλ¦°λ‹€.
    • JavaScript 예제
  • λͺ¨λ“  쌍 μ΅œλ‹¨ 경둜 μ•Œκ³ λ¦¬μ¦˜(ν”Œλ‘œμ΄λ“œ-μ›Œμƒ¬ μ•Œκ³ λ¦¬μ¦˜)
    • ν”Œλ‘œμ΄λ“œ-μ›Œμƒ¬ μ•Œκ³ λ¦¬μ¦˜μ€ 동적 ν”„λ‘œκ·Έλž˜λ°μ˜ 원리λ₯Ό μ΄μš©ν•˜μ§€λ§Œ Ι΅(n3)에 ν•΄κ²°ν•œλ‹€.
    • 이 μ•Œκ³ λ¦¬μ¦˜μ˜ μˆ˜ν–‰ μ‹œκ°„μ€ Ι΅(n)의 for 루프가 μ„Έ κ²Ή μ€‘μ²©λ˜μ—ˆκ³ , 각 κ²½μš°μ— 단 두 κ°€μ§€ 경우의 λŒ€μ†Œλ₯Ό λΉ„κ΅ν•˜λŠ” κ²ƒμœΌλ‘œ μƒμˆ˜ μ‹œκ°„μ΄ κ±Έλ € Ι΅(n3) μ‹œκ°„μ— μˆ˜ν–‰λœλ‹€.
    • ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ μˆœμœ„
    • ν”Œλ‘œμ΄λ“œ-μ›Œμƒ¬ μ•Œκ³ λ¦¬μ¦˜ JavaScript 예제
  • 사이클이 μ—†λŠ” κ·Έλž˜ν”„μ˜ μ΅œλ‹¨ 경둜
  • λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜, 벨만-ν¬λ“œ μ•Œκ³ λ¦¬μ¦˜, 사이클이 μ—†λŠ” κ·Έλž˜ν”„μ˜ μ΅œλ‹¨ 경둜 μ•Œκ³ λ¦¬μ¦˜μ€ ν•˜λ‚˜μ˜ μ‹œμž‘ μ •μ μ—μ„œ λ‹€λ₯Έ λͺ¨λ“  μ •μ κΉŒμ§€ μ΅œλ‹¨ 경둜λ₯Ό κ΅¬ν•œλ‹€.
  • λͺ¨λ“  쌍 μ΅œλ‹¨ 경둜 μ•Œκ³ λ¦¬μ¦˜μ€ λͺ¨λ“  정점 쌍 κ°„μ˜ μ΅œλ‹¨ 경둜λ₯Ό κ΅¬ν•œλ‹€. 즉, μ „μžμ˜ μ•Œκ³ λ¦¬μ¦˜μ€ n-1개의 경둜λ₯Ό κ΅¬ν•˜μ§€λ§Œ, ν›„μžμ˜ μ•Œκ³ λ¦¬μ¦˜μ€ n(n-1)개의 경둜λ₯Ό κ΅¬ν•œλ‹€. κ·Έλž˜μ„œ μ•žμ˜ μœ ν˜•μ„ 단일 μ‹œμž‘μ  μ΅œλ‹¨ 경둜 문제라 ν•˜κ³ , λ’€μ˜ μœ ν˜•μ€ λͺ¨λ“  쌍 μ΅œλ‹¨ 경둜 문제라고 ν•œλ‹€.

🎈 κ°•μ—°κ²° μš”μ†Œ

  • 유ν–₯ κ·Έλž˜ν”„ G=(V, E)μ—μ„œ V의 λͺ¨λ“  정점 쌍(u, v)에 λŒ€ν•΄μ„œ 경둜 u -> v와 v -> uκ°€ μ‘΄μž¬ν•˜λ©΄ κ·Έλž˜ν”„ GλŠ” κ°•ν•˜κ²Œ μ—°κ²°λ˜μ—ˆλ‹€κ³  λ§ν•œλ‹€. 즉, μ–΄λ–€ 두 정점을 μž‘λ”λΌλ„ μ–‘λ°©ν–₯으둜 μ„œλ‘œμ—κ²Œ 이λ₯΄λŠ” κ²½λ‘œκ°€ μ‘΄μž¬ν•˜λ©΄ κ°•ν•˜κ²Œ μ—°κ²°λ˜μ—ˆλ‹€κ³  ν•œλ‹€. κ·Έλž˜ν”„μ—μ„œ κ°•ν•˜κ²Œ μ—°κ²°λœ λΆ€λΆ„ κ·Έλž˜ν”„λ“€μ„ 각각 κ°•μ—°κ²° μš”μ†Œ(Strongly Connected Component)라 ν•œλ‹€.
  • κ°•μ—°κ²° μš”μ†Œ κ΅¬ν•˜κΈ° μ•Œκ³ λ¦¬μ¦˜μ€ μˆ˜ν–‰ μ‹œκ°„μ€ 1번의 DFSλŠ” Ι΅(V+E)μ‹œκ°„μ΄ λ“ λ‹€. 2의 κ·Έλž˜ν”„ GR을 λ§Œλ“œλŠ” 과정도 λͺ¨λ“  간선을 ν•œ λ²ˆμ”© ν›‘μœΌλ©΄μ„œ λ°©ν–₯만 λ°”κΎΈμ–΄μ£Όλ©΄ λ˜λ‹ˆκΉŒ Ι΅(V+E)μ‹œκ°„μ΄ λ“ λ‹€. 3번의 DFS도 Ι΅(V+E)μ‹œκ°„μ΄ λ“ λ‹€. κ·ΈλŸ¬λ―€λ‘œ μ•Œκ³ λ¦¬μ¦˜μ˜ 총 μˆ˜ν–‰ μ‹œκ°„μ€ Ι΅(V+E)이닀.

책에 μžˆλŠ” 예제λ₯Ό κ³΅λΆ€ν•˜κ³  예제λ₯Ό JavaScript둜 풀어보기

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions