κΉ¨μ•Œ κ°œλ… πŸ“‘/μ•Œκ³ λ¦¬μ¦˜

κ·Έλž˜ν”„ - κ·Έλž˜ν”„μ˜ μ’…λ₯˜μ™€ ν‘œν˜„

interfacer_han 2024. 1. 9. 14:18

#1 κ·Έλž˜ν”„

#1-1 κ·Έλž˜ν”„

κ·Έλž˜ν”„λŠ” ν˜„μƒμ΄λ‚˜ 사물을 정점(Vertex)와 κ°„μ„ (Edge)둜 ν‘œν˜„ν•˜λŠ” 것이닀. 정점은 μ–΄λ–€ 개체λ₯Ό λ‚˜νƒ€λ‚΄κ³ , 간선은 κ·Έ κ°œμ²΄λ“€ κ°„μ˜ 관계λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. μœ„ 그림은 각 정점(λ„μ‹œ)을 ν•­κ³΅νŽΈ(κ°„μ„ )이 μž‡λŠ” λͺ¨μŠ΅μ„ ν‘œν˜„ν•œ μ˜ˆμ΄λ‹€. n개의 정점 집합 V와 이듀 간에 μ‘΄μž¬ν•˜λŠ” κ°„μ„ μ˜ 집합 E둜 κ΅¬μ„±λœ κ·Έλž˜ν”„ Gλ₯Ό G = (V, E)둜 κΈ°μˆ ν•œλ‹€.
 

#1-2 κ°€μ€‘μΉ˜κ°€ μ—†λŠ” κ·Έλž˜ν”„ vs κ°€μ€‘μΉ˜κ°€ μžˆλŠ” κ·Έλž˜ν”„

κ°„μ„ μ—λŠ” κ°€μ€‘μΉ˜λ₯Ό 쀄 수 μžˆλ‹€. ν•­κ³΅νŽΈμœΌλ‘œ λΉ„μœ ν•˜μžλ©΄, μš΄ν•­λΉ„κ°€ κ°€μ€‘μΉ˜κ°€ λœλ‹€. κ°€μ€‘μΉ˜κ°€ μ—†λŠ” κ·Έλž˜ν”„λ₯Ό κ°€μ€‘μΉ˜κ°€ μžˆλŠ” κ·Έλž˜ν”„μ²˜λŸΌ 생각할 μˆ˜λ„ μžˆλ‹€. λͺ¨λ“  κ°€μ€‘μΉ˜λ₯Ό 1둜 보면 λœλ‹€.
 

#1-3 무ν–₯ κ·Έλž˜ν”„ vs 유ν–₯ κ·Έλž˜ν”„

ν•­κ³΅νŽΈμ€ λ°˜λ“œμ‹œ μ–‘λ°©ν–₯μ μ΄μ§€λŠ” μ•Šλ‹€. 예λ₯Ό λ“€μ–΄ λŸ°λ˜μ—μ„œ 파리λ₯Ό 갈 수 μžˆμ§€λ§Œ, νŒŒλ¦¬μ—μ„œ λŸ°λ˜μ„ 가지 λͺ»ν•œλ‹€λ©΄ 유ν–₯ κ·Έλž˜ν”„λ‘œ κ·Έ 상황을 ν‘œν˜„ν•  수 μžˆλ‹€. μ„œμšΈκ³Ό λ„μΏ„μ²˜λŸΌ, μ„œλ‘œ 였갈 수 μžˆλ‹€λ©΄ ν™”μ‚΄ν‘œλ₯Ό 2개 μ‚¬μš©ν•œλ‹€.

#1-4 κ°€μ€‘μΉ˜κ°€ μžˆλŠ” 유ν–₯ κ·Έλž˜ν”„

유ν–₯ κ·Έλž˜ν”„μ— κ°€μ€‘μΉ˜κΉŒμ§€ λΆ€μ—¬ν•˜λ©΄ μœ„μ™€ 같은 λͺ¨μŠ΅μ΄ λœλ‹€.
 

#2 κ·Έλž˜ν”„μ˜ ν‘œν˜„ -  인접 ν–‰λ ¬ (Adjacency Matrix)

행렬을 μ΄μš©ν•΄ κ·Έλž˜ν”„λ₯Ό ν‘œν˜„ν•  수 μžˆλ‹€. μ–΄λ–€ κ·Έλž˜ν”„ G = (V, E)의 정점이 n개라면, 크기가 n Γ— n인 2차원 ν–‰λ ¬ Aλ₯Ό μ€€λΉ„ν•œλ‹€. μ–΄λ–€ 두 μ •μ μ—μ„œ μ„œλ‘œλ₯Ό μž‡λŠ” 간선이 μžˆλ‹€λ©΄ 두 정점이 μ„œλ‘œ 인접(Adjacency)ν•œλ‹€κ³  ν‘œν˜„ν•œλ‹€. 2차원 ν–‰λ ¬μ˜ ν–‰κ³Ό μ—΄ 각각의 인덱슀의 λ™μΌν•œ μˆœμ„œλ‘œ 정점을 λ‚˜μ—΄ν•œλ‹€. 그리고 ν–‰λ ¬μ˜ λͺ¨λ“  A[x][y] (에 λŒ€ν•΄ xμ—μ„œ y둜 κ°€λŠ” κ°€μ€‘μΉ˜ 값을 ν• λ‹Ήν•œλ‹€.

λ§Œμ•½, κ°€μ€‘μΉ˜κ°€ μ—†λŠ” κ·Έλž˜ν”„λΌλ©΄ A의 λͺ¨λ“  μ›μ†ŒλŠ” 0 λ˜λŠ” 1일 것이닀. 또 λ§Œμ•½, 무ν–₯ κ·Έλž˜ν”„λΌλ©΄, 행렬은 직선 bλ₯Ό κΈ°μ€€μœΌλ‘œ λŒ€μΉ­μ„ 이룬닀.

이 방법은 직관적이며, κ°„μ„ μ˜ 쑴재 μ—¬λΆ€λ₯Ό A[x][y]λ₯Ό μ°Έμ‘°ν•¨μœΌλ‘œμ¨ 즉각 μ•Œ 수 μžˆλ‹€. ν•˜μ§€λ§Œ, ν–‰λ ¬ μ €μž₯을 μœ„ν•œ n Γ— n 크기의 곡간 그리고, 행렬에 값을 λ„£κΈ° μœ„ν•œ n Γ— n 크기의 μ‹œκ°„μ΄ ν•„μš”ν•˜λ‹€. λ”°λΌμ„œ, κ°„μ„ μ˜ μˆ˜κ°€ λ§Žμ§€ μ•Šμ€ 경우 곡간과 μ‹œκ°„μ΄ λ‚­λΉ„λœλ‹€.
 

#3 인접 λ°°μ—΄ (Adjacency Array)

#3-1 κ°€μ€‘μΉ˜κ°€ μ—†λŠ” 무ν–₯ κ·Έλž˜ν”„μ˜ 경우

λ°°μ—΄λ‘œλ„ κ·Έλž˜ν”„λ₯Ό ν‘œν˜„ν•  수 μžˆλ‹€. λ¨Όμ €, μ •μ μ˜ 갯수만큼 배열을 μ„ μ–Έν•œλ‹€. 각 λ°°μ—΄μ˜ 0번 μ›μ†Œμ—λŠ” ν•΄λ‹Ή 정점과 μ—°κ²°λœ κ°„μ„ (≠정점)의 갯수λ₯Ό ν• λ‹Ήν•œλ‹€ (#3-3의 TMIμ—μ„œ μΆ”κ°€ μ„€λͺ…).

각 λ°°μ—΄μ—μ„œ 0이 μ•„λ‹Œ μΈλ±μŠ€μ—λŠ” 각 배열이 λŒ€λ³€ν•˜λŠ” 정점에 μ—°κ²°λœ μ •μ μ˜ 번호λ₯Ό μ§‘μ–΄λ„£λŠ”λ‹€. 예λ₯Ό λ“€μ–΄, μ„œμšΈμ„ λŒ€λ³€ν•˜λŠ” 3번 λ°°μ—΄ 속 인덱슀 1 ~ 3인 μ›μ†Œμ—λŠ” μ„œμšΈκ³Ό μ—°κ²°λœ λ„μ‹œμΈ 도쿄, 타이베이, λ² μ΄μ§•μ˜ 번호 4, 6, 1을 ν• λ‹Ήν•œλ‹€. 이 λ•Œ, 각 μ •μ μ˜ λ²ˆν˜ΈλŠ” μ˜€λ¦„μ°¨μˆœ λ˜λŠ” λ‚΄λ¦Όμ°¨ 순으둜 μ •λ ¬ν•΄ μ°¨λ‘€λŒ€λ‘œ ν• λ‹Ήν•œλ‹€. μ •λ ¬λœ λ°°μ—΄μ—λŠ” 이진탐색을 μˆ˜ν–‰ν•  수 있기 λ•Œλ¬Έμ— μ–΄λ–€ 간선을 μ°Έμ‘°ν•˜κΈ° μœ„ν•΄ 배열을 μˆœνšŒν•˜λŠ” 과정을 더 빨리 진행할 수 μžˆλ‹€.

간선은 두 정점을 μž‡λŠ”λ°, μœ„ κ·Έλ¦Όμ—μ„œ κ°„μ„ μ˜ κ°―μˆ˜λŠ” 9κ°œμ΄λ―€λ‘œ λ°°μ—΄ 속 μ •μ μ˜ 갯수 즉, λ°°μ—΄ 속 주황색 κΈ€μ”¨μ˜ κ°―μˆ˜λŠ” 9 Γ— 2 = 18λ‹€. 인접 λ°°μ—΄λ‘œ κ·Έλž˜ν”„λ₯Ό ν‘œν˜„ν•˜λ©΄, κ°„μ„ μ˜ κ°―μˆ˜μ— λΉ„λ‘€ν•˜λŠ” 곡간과 μ‹œκ°„μ„ μ μœ ν•˜κΈ° λ•Œλ¬Έμ—, 정점에 λΉ„ν•΄ 간선이 적을 λ•Œ μ•Œλœ°ν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ, 정점 λŒ€λΉ„ 간선이 λΉ‘λΉ‘ν•˜κ²Œ λ§Žμ€ 편이라면 인접 행렬을 μ‚¬μš©ν•˜λŠ” 방법 λŒ€λΉ„ 였히렀 μ˜€λ²„ν—€λ“œκ°€ 많이 λ°œμƒν•œλ‹€.

 

#3-2 κ°€μ€‘μΉ˜κ°€ μ—†λŠ” 무ν–₯ κ·Έλž˜ν”„μ˜ 경우 (κ°„μ†Œν™” 버전)

μœ„μ™€ 같이 κ°„μ†Œν™” ν•  μˆ˜λ„ μžˆλ‹€. #3-1의 0번 인덱슀λ₯Ό μƒλž΅ν–ˆμ§€λ§Œ, λ°°μ—΄μ˜ 길이λ₯Ό μ°Έμ‘°ν•˜λ©΄ μƒλž΅ν–ˆλ˜ μΈλ±μŠ€κ°€ 담은 정보와 같은 정보λ₯Ό μ–»μ–΄λ‚Ό 수 있기 λ•Œλ¬Έμ΄λ‹€.

 

#3-3 κ°€μ€‘μΉ˜κ°€ μžˆλŠ” 유ν–₯ κ·Έλž˜ν”„μ˜ 경우

κ°€μ€‘μΉ˜κ°€ μžˆλŠ” 유ν–₯ κ·Έλž˜ν”„λΌλ©΄ λ‹€μŒκ³Ό 같이 ν‘œν˜„ν•  수 μžˆλ‹€. 제일 λ¨Όμ €, λ‹€λ₯Έ μ •μ μœΌλ‘œ 갈 수 μžˆλŠ” κ°„μ„ μ˜ 갯수(νŒŒλž€ 글씨)λ₯Ό μ λŠ”λ‹€.

 

TMI

더보기

#3-1μ—μ„œλ„ μ–ΈκΈ‰ν–ˆμ§€λ§Œ, κ°„μ†Œν™” 버전이 μ•„λ‹Œ 경우 인접 λ°°μ—΄μ—μ„œ 0번 μΈλ±μŠ€λŠ” μ—°κ²°λœ μ •μ μ˜ κ°―μˆ˜κ°€ μ•„λ‹ˆλΌ, λ‹€λ₯Έ μ •μ μœΌλ‘œ 갈 수 μžˆλŠ” κ°„μ„ μ˜ κ°―μˆ˜λ‹€. 이 사싀은 유ν–₯ κ·Έλž˜ν”„μ—μ„œ μ€‘μš”ν•˜κ²Œ 기얡해두어야 ν•œλ‹€. λ°˜λ“œμ‹œ μ–‘λ°©ν–₯으둜 μ—°κ²°λ˜λŠ” 무ν–₯ κ·Έλž˜ν”„μ™€ 달리, 유ν–₯ κ·Έλž˜ν”„λŠ” 단방ν–₯μœΌλ‘œλ„ 연결될 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ μœ„ κ·Έλž˜ν”„μ—μ„œ μ„œμšΈμ€ 베이징과 'μ—°κ²°'λ˜μ–΄μžˆμ§€λ§Œ, λ°˜λŒ€λ‘œ 베이징은 μ„œμšΈκ³Ό 'μ—°κ²°'λ˜μ–΄μžˆμ§€ μ•Šμ€ μ…ˆμ΄λ‹€. 'κ·Έλž˜ν”„ λΆ„μ•Όμ—μ„œμ˜ μ—°κ²°'μ΄λΌλŠ” λ‹¨μ–΄λŠ” μ΄λ ‡κ²Œ μ„Έμ„Έν•˜κ²Œ 따져봐야 ν•˜λŠ” 것이닀. λ”°λΌμ„œ "(κ°„μ†Œν™” 버전이 μ•„λ‹Œ 경우) 0번 μΈλ±μŠ€λŠ” λ‹€λ₯Έ μ •μ μœΌλ‘œ 갈 수 μžˆλŠ” κ°„μ„ μ˜ κ°―μˆ˜λ‹€!"라고 κΈ°μ–΅ν•΄λ‘μž.

 

이후, μ—°κ²°λœ μ •μ μ˜ 번호λ₯Ό μ˜λ―Έν•˜λŠ” μ›μ†Œ λ°”λ‘œ 였λ₯Έμͺ½μ— κ°€μ€‘μΉ˜ 값을 써 λ„£λŠ”λ‹€. λ”°λΌμ„œ, κ°€μ€‘μΉ˜κ°€ μžˆλŠ” κ·Έλž˜ν”„λ₯Ό 인접 λ°°μ—΄λ‘œ ν‘œν˜„ν•˜λ©΄, 각 λ°°μ—΄μ˜ ν¬κΈ°λŠ” λ°˜λ“œμ‹œ ν™€μˆ˜λ‹€ (1 + 2 Γ— (μ—°κ²°λœ_κ°„μ„ μ˜_갯수)).

 

#3-4 κ°€μ€‘μΉ˜κ°€ μžˆλŠ” 유ν–₯ κ·Έλž˜ν”„μ˜ 경우 (κ°„μ†Œν™” 버전)

#3-2와 같은 λ§₯락으둜 κ°„μ†Œν™”κ°€ κ°€λŠ₯ν•˜λ‹€.

 

#3-5 인접 배열듀을 단일 인접 λ°°μ—΄λ‘œ λ³€ν™˜

#3-3의 0 ~ 6번 배열을 ν•˜λ‚˜λ‘œ ν•©μΉ  μˆ˜λ„ μžˆλ‹€. #3-3μ—μ„œ 인덱슀 0에 ν•΄λ‹Ήν•˜λŠ” 뢀뢄을 νŒŒλž€ κΈ€μ”¨μ²˜λŸΌ λ°”κΎΌλ‹€. νŒŒλž€ κΈ€μ”¨μ˜ μ˜λ―ΈλŠ” ν˜„μž¬ λ°°μ—΄κΉŒμ§€ 포함해 λˆ„μ λœ μ •μ μ˜ κ°―μˆ˜λ‹€. 그리고 λͺ¨λ“  배열을 ν•˜λ‚˜λ‘œ 합쳐 singleAdjacencyArrayλ₯Ό λ§Œλ“ λ‹€. ν•΄λ‹Ή λ°°μ—΄μ—μ„œ μ–΄λ–€ 정점 λ˜λŠ” 간선을 μ°Έμ‘°ν•˜λŠ” λ‘œμ§μ€ 많이 λ³΅μž‘ν•˜κ² μ§€λ§Œ, μ–΄λ–€ κ·Έλž˜ν”„λ₯Ό ν•˜λ‚˜μ˜ λ°°μ—΄λ‘œ λ³€ν™˜ν•  수 μžˆλ‹€λŠ” 것은 λΆ„λͺ…ν•œ μž₯점이닀.