λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍎 iOS/Swift

[Swift] μŠ€ν„°λ”” 7μ£Όμ°¨ - κ·Έλž˜ν”„ μ•Œκ³ λ¦¬μ¦˜

by Danna 2021. 7. 26.
728x90
728x90

6/1 μ§„ν–‰ν–ˆλ˜ μŠ€μœ„ν”„νŠΈ 데이터 ꡬ쑰와 μ•Œκ³ λ¦¬μ¦˜ μ±…μ˜ 5μž₯ '트리 κ΅¬μ‘° κΈ°λ°˜μ˜ μ•Œκ³ λ¦¬μ¦˜' μŠ€ν„°λ”” μ •λ¦¬μž…λ‹ˆλ‹€!


1. κ·Έλž˜ν”„μ˜ κ°œλ…, κ·Έλž˜ν”„μ˜ μ’…λ₯˜

2. κ·Έλž˜ν”„μ˜ ν‘œν˜„ 방식 (μ½”λ“œμ μœΌλ‘œ)

3. κ·Έλž˜ν”„ 탐색 - DFS(κΉŠμ΄μš°μ„ νƒμƒ‰), BFS(λ„ˆλΉ„μš°μ„ νƒμƒ‰)


πŸ’‘ κ·Έλž˜ν”„(Graph)

κ·Έλž˜ν”„λŠ” λ…Έλ“œ(Vertex; 꼭지점)와 λ…Έλ“œλ₯Ό μ—°κ²°ν•˜λŠ” κ°„μ„ (Edge; λͺ¨μ„œλ¦¬)의 μ§‘ν•©μœΌλ‘œ 이루어진 데이터 κ΅¬μ‘°μž…λ‹ˆλ‹€.

 

κ·Έλž˜ν”„λ₯Ό 톡해 μ—°κ²°λ˜μ–΄ μžˆλŠ” κ°μ²΄λ“€μ˜ 관계λ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 

κ·Έλž˜ν”„μ˜ ν™œμš© μ˜ˆμ‹œ : SNS μ—μ„œ μ—°κ²°λœ μ‚¬λžŒλ“€, 지도, μ§€ν•˜μ²  λ…Έμ„ λ„μ˜ μ΅œλ‹¨ 경둜, μ„ μˆ˜ κ³Όλͺ© λ“± ..

 

βœ”οΈŽ κ·Έλž˜ν”„(Graph)의 μ’…λ₯˜

1) 무방ν–₯ κ·Έλž˜ν”„(Undirected Graph)

λ…Έλ“œλ₯Ό μ—°κ²°ν•˜λŠ” 간선이 μ–‘λ°©ν–₯성인 κ·Έλž˜ν”„μž…λ‹ˆλ‹€. λ°©ν–₯이 μ—†λ‹€λŠ” 것은 μ–‘μͺ½μ˜ λ°©ν–₯ λͺ¨λ‘ 이동할 수 μžˆλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

ex) 친ꡬ 관계 A <- - -> B

 

2) λ°©ν–₯ κ·Έλž˜ν”„(Directed Graph)

λ…Έλ“œλ₯Ό μ—°κ²°ν•˜λŠ” 간선에 λ°©ν–₯성이 μ‘΄μž¬ν•˜λŠ” κ·Έλž˜ν”„μž…λ‹ˆλ‹€. κ°„μ„ μ˜ 끝에 λ°©ν–₯성을 λ‚˜νƒ€λ‚΄λŠ” ν™”μ‚΄ν‘œλ₯Ό μΆ”κ°€ν•΄ ν‘œμ‹œν•©λ‹ˆλ‹€.

ex) λ„μ‹œλ₯Ό 왕볡 μ—¬ν–‰ν•  λ•Œμ˜ 경둜 A -> B -> C -> A

 

3) κ°€μ€‘μΉ˜ κ·Έλž˜ν”„(Weighted Graph)

간선에 κ°€μ€‘μΉ˜λ‚˜ λΉ„μš© λ“± 좔가적인 정보가 맀겨진 κ·Έλž˜ν”„μž…λ‹ˆλ‹€. λ„€νŠΈμ›Œν¬(Network) 라고도 λΆ€λ¦…λ‹ˆλ‹€.

ex) λ„μ‹œλ₯Ό 왕볡 μ—¬ν–‰ν•  λ•Œμ˜ κ²½λ‘œμ—μ„œ, 각 κ²½λ‘œλ§ˆλ‹€ λΉ„μš©μ΄ μžˆμ„ λ•Œ μ΅œμ’… λΉ„μš©μ„ κ΅¬ν•˜λŠ” λ“±.


βœ”οΈŽ μ—°κ²° κ·Έλž˜ν”„ vs λΉ„ μ—°κ²° κ·Έλž˜ν”„

1) μ—°κ²° κ·Έλž˜ν”„(Connected Graph)

무방ν–₯ κ·Έλž˜ν”„μ— μžˆλŠ” λͺ¨λ“  λ…Έλ“œμŒμ— λŒ€ν•΄μ„œ 항상 κ²½λ‘œκ°€ μ‘΄μž¬ν•˜λŠ” 경우, λͺ¨λ“  λ…Έλ“œκ°€ μ—°κ²°λœ κ·Έλž˜ν”„μž…λ‹ˆλ‹€.

ex) νŠΈλ¦¬λŠ” 사이클을 가지지 μ•ŠλŠ” μ—°κ²° κ·Έλž˜ν”„

 

2) λΉ„μ—°κ²° κ·Έλž˜ν”„(Disconnected Graph)

무방ν–₯ κ·Έλž˜ν”„μ—μ„œ νŠΉμ • λ…Έλ“œμŒ 사이에 κ²½λ‘œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우, κ·Έλž˜ν”„κ°€ μ „λΆ€ μ—°κ²°λ˜μ–΄ μžˆμ§€ μ•ŠλŠ” κ²½μš°μž…λ‹ˆλ‹€. κ·Έλž˜ν”„κ°€ μ—¬λŸ¬ 개의 λΆ€λΆ„ κ·Έλž˜ν”„λ‘œ ꡬ성될 수 μžˆμŠ΅λ‹ˆλ‹€.

 

βœ”οΈŽ 사이클 vs λΉ„μˆœν™˜ κ·Έλž˜ν”„

1) 사이클(Cycle) 

λ‹¨μˆœ 경둜의 μ‹œμž‘ λ…Έλ“œμ™€ μ’…λ£Œ λ…Έλ“œκ°€ λ™μΌν•œ 경우, 사이클이 μžˆλ‹€κ³  ν‘œν˜„ν•©λ‹ˆλ‹€.

λ‹¨μˆœ κ²½λ‘œλŠ” λ°˜λ³΅λ˜λŠ” 정점이 μ—†λŠ” 경둜λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

 

2) λΉ„μˆœν™˜ κ·Έλž˜ν”„(Acyclic Graph)

사이클이 μ—†λŠ” κ·Έλž˜ν”„λ₯Ό λΉ„μˆœν™˜ κ·Έλž˜ν”„λΌκ³  ν•©λ‹ˆλ‹€. νŠΉμ • κ²½λ‘œμ—μ„œ 같은 λ…Έλ“œλ₯Ό λ°˜λ³΅ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

ex) νŠΈλ¦¬λŠ” 사이클을 가지지 μ•ŠλŠ” μ—°κ²° κ·Έλž˜ν”„

 

βœ”οΈŽ μ™„μ „ κ·Έλž˜ν”„(Complete Graph)

μ™„μ „ κ·Έλž˜ν”„λŠ” κ·Έλž˜ν”„μ— 속해 μžˆλŠ” λͺ¨λ“  정점이 μ„œλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” κ·Έλž˜ν”„μž…λ‹ˆλ‹€.

무방ν–₯ μ™„μ „ κ·Έλž˜ν”„μ˜ λ…Έλ“œ μˆ˜κ°€ n 개라면, κ°„μ„ μ˜ μˆ˜λŠ” n * (n-1) / 2 개 μž…λ‹ˆλ‹€.


πŸ’‘ κ·Έλž˜ν”„μ˜ ν‘œν˜„ 방식

1) ꡬ쑰체 / 클래슀 ν™œμš©

λ…Έλ“œλŠ” μ‹λ³„μž, κ°€μ€‘μΉ˜ 등을 μ†μ„±μœΌλ‘œ κ°–λŠ” ꡬ쑰체 λ˜λŠ” 클래슀둜, 간선은 μ—°κ²°λœ λ…Έλ“œμ— λŒ€ν•œ 참쑰값을 κ°–λŠ” ꡬ쑰체 λ˜λŠ” 클래슀둜 ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ…Έλ“œκ°€ n개, 간선이 m개라면, O(n+m) κ³΅κ°„λ³΅μž‘λ„λ₯Ό κ°–μŠ΅λ‹ˆλ‹€.

 

2) 이웃 λͺ©λ‘ (Adjacency list)

λͺ¨λ“  λ…Έλ“œλŠ” 이웃 λͺ©λ‘μ„ 가지고 있고, 각각의 이웃 λͺ©λ‘μ—λŠ” λ…Έλ“œμ™€ μ—°κ²°λœ λ…Έλ“œλ“€μ΄ ν¬ν•¨λ©λ‹ˆλ‹€.

@이웃 λͺ©λ‘ A: [C], B: [C, D], C: [A, B], D: [B]

 

3) 이웃 맀트릭슀 (Adjacency matrix)

λ…Έλ“œκ°€ n개일 λ•Œ, n x n 의 이차원 배열을 λ§Œλ“€μ–΄, 두 λ…Έλ“œλ₯Ό μ—°κ²°ν•˜λŠ” λͺ¨μ„œλ¦¬κ°€ 있으면 1, μ—†μœΌλ©΄ 0 으둜 ν‘œμ‹œν•©λ‹ˆλ‹€.

νŠΉμ • κ°„μ„ μ˜ 쑴재 μ—¬λΆ€λ₯Ό 확인할 λ•Œ μœ μš©ν•˜λ‹€. 이웃 λͺ©λ‘μ— λΉ„ν•΄ 더 λ§Žμ€ 곡간을 ν•„μš”λ‘œ ν•©λ‹ˆλ‹€.

   A B C D
A 0 0 1 0
B 0 0 1 1
C 1 1 0 0
D 0 1 0 0

 

4) κ·Όμ ‘ 맀트릭슀 (Incidence matrix)

ν–‰(row)은 λ…Έλ“œλ‘œ, μ—΄(column)은 κ°„μ„ μœΌλ‘œ ν‘œμ‹œν•˜μ—¬ λ…Έλ“œκ°€ μ—°κ²°λœ 간선에 1을, μ—°κ²°λ˜μ§€ μ•Šμ€ κ³³μ—λŠ” 0을 ν‘œμ‹œν•©λ‹ˆλ‹€.

각 행을 읽어보면, νŠΉμ • λ…Έλ“œμ— μ–΄λŠ 간선이 μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

   1 2 3
A 1 0 0
B 0 1 1
C 1 1 0
D 0 0 1

 

πŸ’‘κ·Έλž˜ν”„ 탐색 - 깊이 μš°μ„  탐색(DFS, Depth-First Search)

νŠΉμ • λ…Έλ“œμ—μ„œ μ‹œμž‘ν•΄, λ‹€μŒ λΆ„κΈ°(branch)둜 λ„˜μ–΄κ°€κΈ° μ „, ν•΄λ‹Ή λΆ„κΈ°λ₯Ό μ™„λ²½ν•˜κ²Œ νƒμƒ‰ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€. μΌλ°˜μ μœΌλ‘œ λͺ¨λ“  λ…Έλ“œλ₯Ό λ°©λ¬Έν•˜κ³ μž ν•  λ•Œ, DFS λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

 

트리의 경우, 루트 λ…Έλ“œμ—μ„œ μ‹œμž‘ν•΄ μ•„λž˜λ‘œ λ‚΄λ €κ°€ 깊게 νƒμƒ‰ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

"쒌츑 λ…Έλ“œ λ°©λ¬Έ -> 쀑앙 λ…Έλ“œ λ°©λ¬Έ -> 우츑 λ…Έλ“œ λ°©λ¬Έ" μˆœμ„œλ‘œ νƒμƒ‰ν•˜λ©°, μ΄μ§„κ²€μƒ‰νŠΈλ¦¬μ˜ In-order tree walk 와 λ™μΌν•©λ‹ˆλ‹€.

 

 

πŸ’‘κ·Έλž˜ν”„ 탐색 - λ„ˆλΉ„ μš°μ„  탐색(BFS, Breadth-First Search )

κ·Έλž˜ν”„ 탐색 μ‹œ, νŠΉμ • λ…Έλ“œμ—μ„œ μ‹œμž‘ν•΄ μΈμ ‘ν•œ λ…Έλ“œλ₯Ό λ¨Όμ € νƒμƒ‰ν•©λ‹ˆλ‹€. 두 λ…Έλ“œ μ‚¬μ΄μ˜ μ΅œλ‹¨ 경둜, μž„μ˜μ˜ 경둜λ₯Ό μ°Ύκ³  싢을 λ•Œ BFS λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. BFS λŠ” κ°κ°μ˜ λ…Έλ“œλ₯Ό 단 ν•œλ²ˆλ§Œ λ°©λ¬Έν•œλ‹€λŠ” νŠΉμ§•μ΄ μžˆμŠ΅λ‹ˆλ‹€.

 

트리의 경우, 루트 λ…Έλ“œμ—μ„œ μ‹œμž‘ν•΄ λ‹€μŒ 레벨의 λ…Έλ“œλ₯Ό μ „λΆ€ νƒμƒ‰ν•œ ν›„, μ•„λž˜λ‘œ λ‚΄λ €κ°€λŠ” κ²ƒμž…λ‹ˆλ‹€. 

 

πŸ‘©‍πŸ’» κ·Έλž˜ν”„ 탐색 (DFS / BFS) - μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œν’€μ΄

 

[μ•Œκ³ λ¦¬μ¦˜/Swift] κ·Έλž˜ν”„νƒμƒ‰(DFS/BFS) - νƒ€κ²Ÿλ„˜λ²„, λ„€νŠΈμ›Œν¬, λ‹¨μ–΄λ³€ν™˜, μ—¬ν–‰κ²½λ‘œ

1. νƒ€κ²Ÿ λ„˜λ²„ (DFS) 1을 λ”ν•˜κ±°λ‚˜ λΊ„ 수 있기 λ•Œλ¬Έμ—, λ”ν•˜κ±°λ‚˜ λΉΌλŠ” κ²½μš°μ— λŒ€ν•΄ ν•œλ²ˆμ”© DFS λ₯Ό μˆ˜ν–‰ν•΄μ€€λ‹€. 이λ₯Ό κ·Έλž˜ν”„λ‘œ 그렀보면 μ΄ν•΄ν•˜κΈ° 쉽닀. 숫자λ₯Ό ν•˜λ‚˜ λ”ν•˜κ±°λ‚˜ λΉΌλŠ” 것을 κ·Έλž˜ν”„μ˜ 깊이

jellysong.tistory.com

 

참고 링크

728x90
728x90