์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- HAVIT
- ๊ธฐ์ด๋ฌธ๋ฒ
- ์ด์งํ์
- IOS
- SwiftUI
- dfs
- ์ฐ์ํ์ค๋ถ๋ถ์์ด์ํฉ
- duno
- binarySearch
- algorithm
- ๊ณ ๋์ kit
- SQL
- 0์ด๋์ด์๋๊ธธ
- GCD
- concurrency
- GroupBy
- URLSession
- Swift
- ํ๋ก๊ทธ๋๋จธ์ค
- SwiftUI Tutorials
- algoritm
- DynamicProgramming
- SOPT
- ๋์ ๊ณํ๋ฒ
- Til
- discardableResult
- APPJAM
- SwiftUI ํํ ๋ฆฌ์ผ
- ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ
- BFS
- Today
- Total
suvera-dev ๐ฅฆ
Algorithm) DFS/BFS ๋ณธ๋ฌธ
๐ DFS
- ๊น์ด ์ฐ์ ํ์์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
- ๊ทธ๋ํ์ ๊ธฐ๋ณธ๊ตฌ์กฐ๋ฅผ ์์์ผํจ โฌ๏ธ
๐ ๊ทธ๋ํ๋ ๋ ธ๋์ ๊ฐ์ ์ผ๋ก ํํ๋๋ฉฐ ์ด๋ ๋ ธ๋๋ฅผ ์ ์ ์ด๋ผ๊ณ ๋ ๋งํ๋ค. ๊ทธ๋ํ ํ์์ด๋ ํ๋์ ๋ ธ๋๋ฅผ ์์์ผ๋ก ๋ค์์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ ๋งํ๋ค. ๋ํ ๋ ๋ ธ๋๊ฐ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด ๋ ๋ ธ๋๋ ์ธ์ ํ๋ค ๋ผ๊ณ ํํํ๋ค
- ํ๋ก๊ทธ๋๋ฐ์์ ๊ทธ๋ํ๋ ํฌ๊ฒ 2๊ฐ์ง ๋ฐฉ์์ผ๋ก ํํํ ์ ์๋๋ฐ ์ฝ๋ฉ ํ ์คํธ์์๋ ์ด ๋ ๋ฐฉ์ ๋ชจ๋ ํ์ํ๋ ๋ ๊ฐ๋ ์ ๋ํด ๋ฐ๋ฅด๊ฒ ์๊ณ ์๋๋ก ํ์ !
1. ์ธ์ ํ๋ ฌ : 2์ฐจ์ ๋ฐฐ์ด๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ์
- 2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ํํ๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฉ์
- ์ฐ๊ฒฐ๋ ๊ทธ๋ํ๋ฅผ ์ธ์ ํ๋ ฌ๋ก ํํํ ๋ ํ์ด์ฌ์์๋ 2์ฐจ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ ์ ์๋ค.
- ์ฐ๊ฒฐ์ด ๋์ด ์์ง ์์ ๋ ธ๋๋ผ๋ฆฌ๋ ๋ฌดํ์ ๋น์ฉ์ด๋ผ๊ณ ์์ฑํ๋ค. ์ค์ ์ฝ๋์์๋ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ ๋ต์ด ๋ ์ ์๋ ํฐ ๊ฐ ์ค์์ 999999999, 987654321 ๋ฑ์ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
INF = 9999999999 # ๋ฌดํ์ ๋น์ฉ ์ ์ธ
# 2์ฐจ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด ์ธ์ ํ๋ ฌ ํํ
graph = [
[0,7,5],
[7,0,INF],
[5,INF,0]
]
print(graph)
2. ์ธ์ ๋ฆฌ์คํธ : ๋ฆฌ์คํธ๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ์
- ๋ชจ๋ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ์ฐจ๋ก๋๋ก ์ฐ๊ฒฐํ์ฌ ์ ์ฅ
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ๊ตฌํํ๋ค.
- ํ์ด์ฌ์์๋ ๊ธฐ๋ณธ ์๋ฃํ์ธ ๋ฆฌ์คํธ ์๋ฃํ์ด append()์ ๋ฉ์๋ ์ ๊ณต
- ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด ๊ทธ๋ํ๋ฅผ ํํํ๊ณ ์ ํ ๋๋ ๋จ์ํ 2์ฐจ์ ๋ฆฌ์คํธ ์ด์ฉ !
# ํ(Row)์ด 3๊ฐ์ธ 2์ฐจ์ ๋ฆฌ์คํธ๋ก ์ธ์ ๋ฆฌ์คํธ ํํ
graph = [[] for _ in range(3)]
# ๋
ธ๋ 0์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ(๋
ธ๋, ๊ฑฐ๋ฆฌ)
graph[0].append((1,7))
graph[0].append((2,5))
# ๋
ธ๋ 1์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ(๋
ธ๋, ๊ฑฐ๋ฆฌ)
graph[1].append((0,7))
# ๋
ธ๋ 2์ ์ฐ๊ฒฐ๋ ๋
ธ๋ ์ ๋ณด ์ ์ฅ(๋
ธ๋, ๊ฑฐ๋ฆฌ)
graph[2].append((0.5))
print(graph)
=> ์ด ๋ ๋ฐฉ์์ ์ด๋ค ์ฐจ์ด์ผ๊น์? ์ฝ๋ฉ ํ ์คํธ๋ฅผ ์ํด ํ์ตํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ์ธก๋ฉด์์ ์ดํด๋ณด์ !
1. ๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด :
์ธ์ ํ๋ ฌ ๋ฐฉ์์ ๋ชจ๋ ๊ด๊ณ๋ฅผ ์ ์ฅํ๋ฏ๋ก ๋ ธ๋ ๊ฐ์๊ฐ ๋ง์ ์๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถํ์ํ๊ฒ ๋ญ๋น๋๋ค.
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ง์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
2. ์๋ ์ธก๋ฉด :
๋ฐ๋ฉด ์๋ ์ธก๋ฉด์์, ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ์ธ์ ํ๋ ฌ ๋ฐฉ์์ ๋นํด ํน์ ํ ๋ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์ป๋ ์๋๊ฐ ๋๋ฆฌ๋ค.
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์์๋ ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
ex) ๋ ธ๋ 1๊ณผ ๋ ธ๋ 7์ด ์ฐ๊ฒฐ๋์ด ์์ ๋, ์ธ์ ํ๋ ฌ ๋ฐฉ์์์๋ graph[1][7]๋ง ํ์ธํ๋ฉด ๋๋ค. ๋ฐ๋ฉด์ ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์์๋ ๋ ธ๋ 1์ ๋ํ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์์์๋ถํฐ ์ฐจ๋ก๋๋ก ํ์ธํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํน์ ํ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ธ์ ๋ ธ๋๋ฅผ ์ํํด์ผํ๋ ๊ฒฝ์ฐ, ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ด ์ธ์ ํ๋ ฌ ๋ฐฉ์์ ๋นํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ญ๋น๊ฐ ์ ๋ค.
DFS๋ ๊น์ด ์ฐ์ ํ์ ์๊ณ ๋ฆฌ์ฆ !
- ํน์ ํ ๊ฒฝ๋ก๋ก ํ์ํ๋ค๊ฐ ํน์ ํ ์ํฉ์์ ์ต๋ํ ๊น์์ด ๋ค์ด๊ฐ์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ํ, ๋ค์ ๋์๊ฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉ !
1) ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
2) ์คํ์ ์ต์๋จ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ๊ทธ ์ธ์ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
3) 2๋ฒ์ ๊ณผ์ ์ ๋ฐ๋ณต ํ๋ค
# ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ ์ฌ๋ฌ๊ฐ ์์ผ๋ฉด ๋ฒํธ๊ฐ ๋ฎ์ ์์ ๋ถํฐ ์ฒ๋ฆฌํ๋ค.
# ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ N๊ฐ์ธ ๊ฒฝ์ฐ O(N)์ ์๊ฐ์ด ์์๋๋ค๋ ํน์ง์ด ์๋ค.
#DFS ๋ฉ์๋ ์ ์
def dfs(graph, v, visited):
# ํ์ฌ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
visited[v] = True
print(v, end= ' ')
# ํ์ฌ ๋
ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋
ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐฉ๋ฌธ
for i in graph[v]:
if not visited[i]:
dfs(graph, i, visited)
# ๊ฐ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ(2์ฐจ์ ๋ฆฌ์คํธ)
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
# ๊ฐ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ(1์ฐจ์ ๋ฆฌ์คํธ)
visited = [False] * 9
# ์ ์๋ dfs ํจ์ ํธ์ถ
dfs(graph, 1, visited)
BFS ์๊ณ ๋ฆฌ์ฆ์ ๋๋น ์ฐ์ ํ์ ์๊ณ ๋ฆฌ์ฆ !
- ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ ์ ์ ์ถ ๋ฐฉ์์ธ ํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉ
- ์ธ์ ํ ๋ ธ๋๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํ์ ๋ฃ๋๋ก ์๊ณ ๋ฆฌ์ฆ์ ์์ฑํ๋ฉด ์์ฐ์ค๋ฝ๊ฒ ๋จผ์ ๋ค์ด์จ ๊ฒ์ด ๋๊ฐ๊ฒ ๋์ด, ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ ์งํ !
1) ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
2) ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ด ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
3) 2๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค
- deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ, ์ค์ ์ํ์๊ฐ์ DFS ๋ณด๋ค ์ข์ ํธ !
from collections import deque
# BFS ๋ฉ์๋ ์ ์
def bfs(graph, start, visited):
# ํ ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
queue = deque([start])
# ํ์ฌ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
visited[start] = True
# ํ๊ฐ ๋น ๋ ๊น์ง ๋ฐ๋ณต
while queue:
# ํ์์ ํ๋์ ์์๋ฅผ ๋ฝ์ ์ถ๋ ฅ
v = queue.popleft()
print(v, end=' ')
# ํด๋น ์์์ ์ฐ๊ฒฐ๋, ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์์๋ค์ ํ์ ์ฝ์
for i in graph[v]:
if not visited[i]:
queue.append(i)
visited[i] = True
# ๊ฐ ๋
ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ - 2์ฐจ์ ๋ฆฌ์คํธ
graph = [
[],
[2, 3, 8],
[1, 7],
[1, 4, 5],
[3, 5],
[3, 4],
[7],
[2, 6, 8],
[1, 7]
]
# ๊ฐ ๋
ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ(1์ฐจ์ ๋ฆฌ์คํธ)
visited = [False] * 9
# ์ ์๋ dfs ํจ์ ํธ์ถ
bfs(graph, 1, visited)
โจ ์ด๋ ๊ฒ DFS์ BFS์ ๊ตฌํ์ ๋ํด ์์๋ณด์๋๋ฐ, ๊ฐ๋จํ ์ ๋ฆฌํ์๋ฉด
DFS | BFS | |
๋์ ์๋ฆฌ | ์คํ | ํ |
๊ตฌํ ๋ฐฉ๋ฒ | ์ฌ๊ท ํจ์ ์ด์ฉ | ํ ์๋ฃ๊ตฌ์กฐ ์ด์ฉ |
์ด๋ ๋ค ! ๋ํ, 1์ฐจ์ ๋ฐฐ์ด์ด๋ 2์ฐจ์ ๋ฐฐ์ด์ ๊ทธ๋ํ ํํ๋ก ์๊ฐํ๋ฉด ์์ํ๊ฒ ๋ฌธ์ ๋ฅผ ํ์ ์๋ค.
2์ฐจ์ ๋ฐฐ์ด์์์ ํ์๋ฌธ์ ๋ฅผ ๋ง๋๋ค๋ฉด, ๊ทธ๋ํ ํํ๋ก ๋ฐ๊ฟ์ ์๊ฐํ๋ฉด ํ์ด ๋ฐฉ๋ฒ์ ์ข ๋ ์ญ๊ฒ ๋ ์ฌ๋ฆด ์ ์๋ค.
'Algorithm > CodingTest - Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Algorithm) Sorting (0) | 2022.04.03 |
---|---|
Algorithm) DFS/BFS ์ค์ ๋ฌธ์ (0) | 2022.04.02 |
Algorithm) ์๋ฃ๊ตฌ์กฐ ๊ธฐ์ด (Feat. DFS์ BFS์ ๋ค์ด๊ฐ๊ธฐ ์ ..) (1) | 2022.04.01 |
Algorithm ) Implementation (0) | 2022.04.01 |
Algorithm ) Greedy (2) (2) | 2022.02.06 |