๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ( Graph Search Algorithm )
๐ ๋ชฉ ์ฐจ
โ ๊ทธ๋ํ ํ์
Depth-First Search( DFS )
Breadth-First Search ( BFS )
โ ๊ทธ๋ํ ํ์
๊ทธ๋ํ ํ์ ๋ฌธ์ ๋? ์ด๋ค ํ ๊ทธ๋ํ์ ํด๋น ๊ทธ๋ํ์ ์์ ์ ์ ์ด ์ฃผ์ด์ก์ ๋, ์์์ ์์ ๊ฐ์ (Edge, E)์ ํ๊ณ ์ด๋ํ ์ ์๋ ์ ์ (Vertex, V)๋ค์ ๋ชจ๋ ์ฐพ์์ผ ํ๋ ๋ฌธ์ ๋ฅผ ์๋ฏธํฉ๋๋ค.
๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ (Graph Search Algorithm)์๋ ํํ ๋๋น ์ฐ์ ํ์( Breadth-First Search, BFS)๊ณผ ๊น์ด ์ฐ์ ํ์(Depth-First Search, DFS)์ด ์์ต๋๋ค.
๐ถ Depth-First Search
DFS ์์ฝ
-๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
-๋ฃจํธ ๋ ธ๋(or ๋ค๋ฅธ ์์์ ๋ ธ๋)์์ ์์ํด์ ๋ค์ ๋ถ๊ธฐ(branch)๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ํด๋น ๋ถ๊ธฐ๋ฅผ ์๋ฒฝํ๊ฒ ํ์ํ๋ ๋ฐฉ๋ฒ
-์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ด
๊น์ด ์ฐ์ ํ์์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ด์ ๋ ๊ทธ๋ํ์ ์์์ ์์ ๋ค์ ๋ธ๋์น๋ก ๋์ด๊ฐ๊ธฐ ์ ์, ํด๋น ๋ธ๋์น๋ฅผ ๋ชจ๋ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๊ณ ๋ฆฌ์ฆ ๊ฐ์๋ ์์์ → ์์์ ์ ์ฐ๊ฒฐ๋ ์ ์ → ์์์ ์ ์ฐ๊ฒฐ๋ ์ ์ ์ ์ฐ๊ฒฐ๋ ์ ์ ~ ์์ผ๋ก ์ฌ๊ท ํน์ ์คํ ํตํด ํ์์ ์ํํ๊ณ ๋ ์ด์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ด ์์ ๋๊น์ง ํ์ํ๋ฉด ๋ค์ ๋๋์๊ฐ ์ฐ๊ฒฐ๋ ์ ์ ์ ํ์ํ๋ฉด ๋ฉ๋๋ค.
์๊ฐ๋ณต์ก๋๋ ์ธ์ ํ๋ ฌ๋ก ๊ตฌํํ๋๋, ์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํ ํ๋๋์ ๋ฐ๋ผ์ ๋ค๋ฅธ๋ฐ, ์๋์ ๊ฐ์ต๋๋ค.
- ์ธ์ ํ๋ ฌ : O(V^2)
- ์ธ์ ๋ฆฌ์คํธ : O(V+E)
๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์์ ๋ณด๋ฉด, ์ธ์ ํ๋ ฌ ๋ฐฉ์์ ๋ชจ๋ ๊ด๊ณ๋ฅผ ์ ์ฅํ๋ฏ๋ก ์ ์ (๋ ธ๋)๊ฐฏ์๊ฐ ๋ง์์๋ก, ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถํ์ํ๊ฒ ๋ญ๋น๋ฉ๋๋ค. ๋ฐ๋ฉด, ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ์ฐ๊ฒฐ๋ ์ ๋ณด ๋ง์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํฉ๋๋ค.
์ฆ, ๋ฉ๋ชจ๋ฆฌ ํจ์จ : ์ธ์ ๋ฆฌ์คํธ > ์ธ์ ํ๋ ฌ
์๋ ์ธก๋ฉด์์ ๋ณด๋ฉด, ์ธ์ ํ๋ ฌ ๋ฐฉ์์ graph[1][2]์ ๊ฐ์ด ๋ฐ๋ก ํ์ธ์ด ๊ฐ๋ฅํ์ง๋ง, ์ธ์ ๋ฆฌ์คํธ๋ ๋ ธ๋์ ๋ํ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฐจ๋ก๋ก ์ํํ์ฌ์ผ ํ๋ฏ๋ก ์ ๋ณด๋ฅผ ์ป๋ ์๋๊ฐ ๋๋ฆฝ๋๋ค.
์ฆ, ์กฐํ ์๋ : ์ธ์ ๋ฆฌ์คํธ < ์ธ์ ํ๋ ฌ
๊ทธ๋ฌ๋ฏ๋ก ํน์ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ธ์ ๋ ธ๋๋ฅผ ์ํ ํด์ผ ํ ๋๋ ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๋ญ๋น๊ฐ ์ ์ต๋๋ค.
์คํ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ DFS์ ๊ตฌ์ฒด์ ์ธ ๋์ ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์์์ ์ธ 1๋ฒ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
- ์คํ ์ต์๋จ ๋ ธ๋(1๋ฒ)์ ๋ฏธ๋ฐฉ๋ฌธํ ๋ ธ๋ ์ค ๊ฐ์ฅ ๋ฒํธ๊ฐ ๋ฎ์ 2๋ฒ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
- ์คํ ์ต์๋จ ๋ ธ๋(2๋ฒ)์ ๋ฏธ๋ฐฉ๋ฌธํ ๋ ธ๋(7๋ฒ)๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
- ์คํ ์ต์๋จ ๋ ธ๋(7๋ฒ)์ ๋ฏธ๋ฐฉ๋ฌธํ ๋ ธ๋ ์ค ๊ฐ์ฅ ๋ฒํธ๊ฐ ๋ฎ์ 6๋ฒ ๋ฃ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
- ์คํ ์ต์๋จ ๋ ธ๋(6๋ฒ)์ ๋ฏธ๋ฐฉ๋ฌธํ ๋ ธ๋๊ฐ ์์ ๋๋ ์ถ์ถ(pop)
- ์คํ ์ต์๋จ ๋ ธ๋(7๋ฒ)์ ๋ฏธ๋ฐฉ๋ฌธํ ๋ ธ๋(8๋ฒ)๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
- ์ด์ ๊ฐ์ ๋ฉ์ปค๋์ฆ์ผ๋ก ์คํ์ ์๋ฌด๊ฒ๋ ์์ ๋๊น์ง ๋ฐ๋ณต
1) ์ฌ๊ทํจ์(Recursive Function)
์ฌ๊ท ํจ์๋ ์๊ธฐ ์์ ์ ๋ค์ ํธ์ถํ๋ ํจ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด๋ฅผ ์์ฑํ ๋์๋ ๋ฐ๋์ ์ข ๋ฃ ์กฐ๊ฑด์ ๋ง๋ค์ด์ ํจ์๋ฅผ ์์ฑํด์ผํฉ๋๋ค. ๋ง์ฝ ์ข ๋ฃ ์กฐ๊ฑด์ ์ ๋๋ก ๋ช ์ํ์ง ์์ผ๋ฉด, ํจ์๊ฐ ๋ฌดํ์ด ํธ์ถ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
(1) ์ฌ๊ทํจ์ ์์ฉ : ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ
์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ๋ ๊ฐ์ ์๊ฐ ์ฃผ์ด์ก์ ๋, ์ต๋๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
๊ธฐ๋ณธ๊ฐ๋ ์ ๋ ๊ฐ์ A, B๊ฐ ์กด์ฌํ๊ณ , A๋ฅผ B๋ก ๋๋ ๋๋จธ์ง๋ฅผ C๋ผ๊ณ ํ๊ฒ ์ต๋๋ค. ( A > B )
์ด ๋, A์ B์ ์ต๋๊ณต์ฝ์๋ B์ C์ ์ต๋๊ณต์ฝ์์ ๊ฐ์ต๋๋ค. (์ฆ๋ช ์ ์ฐพ์๋ด์ผ ํ๋ค.)
์ด๋ฌํ ์ฑ์ง์ ์ด์ฉํด์ ๊ณ์์ ์ผ๋ก ๋๋์ ์ ์งํํด์ C๊ฐ 0์ด ๋์์ ๋, ์ฆ ๋๋จธ์ง๊ฐ 0์ด ๋์์ ๋์ ๋๋๋ ์๊ฐ ์ต๋๊ณต์ฝ์๊ฐ ๋ฉ๋๋ค.
๐ถ Java๋ก ๊ตฌํํ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ
/**
* ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ ๊ตฌํ ๋ฉ์๋
* @param bn : ํฐ ์ซ์
* @param sn : ์์ ์ซ์
* @return
* ํฐ ์ซ์๋ฅผ ์์์ซ์๋ก ๋๋ ๊ฐ์ด 0์ด๋ฉด ์์์ซ์ ๋ฆฌํด, ์๋๋ฉด ์ฌ๊ทํํ๋ก ์์ ์ ํธ์ถ
*/
public int eucd(int bn, int sn) {
// ํฐ์ซ์๋ฅผ ์์์ซ์๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ณ์ฐ
int r = bn % sn;
// ๋๋จธ์ง๊ฐ 0์ด๋ฉด ์์์ซ์๊ฐ ์ต๋๊ณต์ฝ์์ด๋ฏ๋ก ์์์ซ์ ๋ฆฌํด
if (r == 0) {
return sn;
} else {
// ๋๋จธ์ง๊ฐ 0 ์ด์์ด๋ฉด ์ฌ๊ทํํ๋ก ํธ์ถ
// ์ด๋ ํ๋ผ๋ฏธํฐ๋ ์์์ซ์์ ๋๋จธ์ง๋ฅผ ๋ฃ์ด์ค
return eucd(sn, r);
}
}
์์)
72, 42 ๋ ๊ฐ์ ์๋ก ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ์ฌ์ฉํด์ ์ต๋๊ณต์ฝ์๋ฅผ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค.
- ๋จผ์ ๋๊ฐ์ ์ ์ค ํฐ ์๋ฅผ ์ฐพ์ต๋๋ค. ์ฌ๊ธฐ์๋ 72์ ๋๋ค.
- ํฐ ์๋ฅผ ์์ ์๋ก ๋๋ ์ ๋๋จธ์ง๋ฅผ ๊ตฌํฉ๋๋ค. => 72 % 42 = 30(๋๋จธ์ง)
- ๋๋จธ์ง๋ฅผ ๊ฐ์ง๊ณ ์์์ ๋๋ ์๋ฅผ ๋ค์ ๋๋ ์ ๋๋จธ์ง๋ฅผ ๊ตฌํฉ๋๋ค. => 42 % 30 = 12(๋๋จธ์ง)
- 3๋ฒ์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค. => 30 % 12 = 6(๋๋จธ์ง)
- 3๋ฒ์ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค. => 12 % 6 = 0(๋๋จธ์ง)
- 5๋ฒ์ ๊ณผ์ ์ ๋ง์ง๋ง์ผ๋ก ๋๋จธ์ง๊ฐ 0์ด ๋์์ผ๋ฏ๋ก ๊ทธ ์์ ์ ๋๋ ์๊ฐ ์ต๋๊ณต์ฝ์๊ฐ ๋ฉ๋๋ค.
- ์์ ์์๋๋ก๋ผ๋ฉด 72์ 42์ ์ต๋๊ณต์ฝ์๋ 6์ด ๋ฉ๋๋ค.
๐ถ Breadth-First Search
BFS ์์ฝ
- ๋๋น์ฐ์ ํ์
- ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
- ํ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ์ดํ๋ค.
- ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ค์ ์ํ ์๊ฐ์ DFS๋ณด๋ค ์ข์ ํธ์ด๋ค.
BFS๋ ๊ทธ๋ํ์ ์์์ ์์ (๋๋น๊ฐ) ๊ฐ๊น์ด ์ ๋ค๋ถํฐ ์ฐ์ ์ ์ผ๋ก ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๊ณ ๋ฆฌ์ฆ ๊ฐ์๋ ์์์ ์ ํ(Queue)์ ๋ฃ์ ๋ค์ ํ์ ์๋ฌด๋ฐ ์์๊ฐ ์์ ๋๊น์ง ์ธ์ ํ ์ ์ ๋ค์ ํ์ํด ๋์๊ฐ๋ฉด ์งํ๋ฉ๋๋ค.
์ด ๋ ์ธ์ ํ ์ ์ ๋ค์ ๋ณด๋ ๊ณผ์ ์, ๊ทธ๋ํ๋ฅผ ์ธ์ ํ๋ ฌ๋ก ์ ์ฅํ๋ฉด O(V^2), ์ธ์ ๋ฆฌ์คํธ๋ก ์ ์ฅํ๋ฉด O(V+E)์ด ๋ฉ๋๋ค.
์๊ฐ ๋ณต์ก๋
- ์ธ์ ํ๋ ฌ : O(v^2)
- ์ธ์ ๋ฆฌ์คํธ : O(V+E)
ํ๋ฅผ ์ด์ฉํ BFS์ ๊ตฌ์ฒด์ ์ธ ๋์๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์์์ ์ธ 1์ ํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- 1์ ๊บผ๋ด๊ณ ์ธ์ ํ ์ ์ ์ธ 2,3,8์ ํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค.
- ํ์ 2๋ฅผ ๊บผ๋ด๊ณ ๋ฐฉ๋ฌธํ์ง ์์ 7์ ๊บผ๋ด์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
- ํ์์ 3์ ๊บผ๋ด๊ณ ๋ฐฉ๋ฌธํ์ง ์์ 4,5๋ฅผ ๊บผ๋ด์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ
- ์์ ๊ฐ์ด ํ์์ ๋ ์ด์ ๊บผ๋ผ ๊ฒ์ด ์์ ๋๊น์ง ๋ฐ๋ณต
โ ๋๋น์ฐ์ ํ์์ ํ ๋ ๋ค๋ฅธ ์๋ฃ๊ตฌ์กฐ๋ ์๋ ๊ตณ์ด ํ(Queue) ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ผ๊น?
๋จผ์ ํ์๋๋ ์์น๋ฅผ ๋จผ์ ๋นผ๋ด์ ์ธ์ ํ ์ ๋ค์ ๋ณธ๋ค๋ ์๊ตฌ ์ฌํญ ๋๋ฌธ์ ๋๋ค.
์ด๋ฌํ ์๊ตฌ์ฌํญ์ ์ง์ํ๋ ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ๋น ๋ฅด๊ณ ์ปดํฉํธํ ์๋ฃ๊ตฌ์กฐ๊ฐ ํ(Queue)์ด๊ธฐ ๋๋ฌธ์ ๋๋ค.
โ FIFO๋ฅผ ๋ฆฌ์คํธ๋ก ๊ตฌํํ๋ ๊ฒ ์๋๋ผ deque๋ฅผ ์ฌ์ฉํ๋ ์ด์ ?
deque์์ ์์๋ฅผ ์ฝ์ ํ ๋๋ .append(N)๋ฅผ ์ฌ์ฉํ๊ณ , ์์๋ฅผ ๋บ ๋๋ .popleft(), ์์๋ฅผ ์ญ์์ผ๋ก ๋ฐ๊พธ๊ณ ์ ํ ๋๋ .reverse()๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํด์ ํน์ ์ธ๋ฑ์ค์ ์์๋ฅผ ์ญ์ ํ๊ธฐ์ํด .pop๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ์์๋ฅผ ๊บผ๋ด๊ณ ์์น๋ฅผ ์กฐ์ ํ๋ O(k) ๋งํผ ์๊ฐ๋ณต์ก๋๊ฐ ๋ ํ์ํ๊ธฐ ๋๋ฌธ์ list๊ฐ ์๋ deque๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๐ถ ‘์ต๋จ๊ฑฐ๋ฆฌ’ ๋ฌธ์ ์์ ๋๋น์ฐ์ ํ์(BFS) ์ฌ์ฉํ๊ธฐ
BFS๊ฐ ๋น์ ๋ฐํ๋ ๊ฒฝ์ฐ๋ ๊ทธ๋ํ์ ๊ฐ์ ์ ๊ฐ์ค์น๊ฐ ๋ชจ๋ ๋์ผํ ๋ ๋ํ๋ฉ๋๋ค. ์ด ๋, ์์์ ์์ ๋ชจ๋ ์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ ๋ฌ๋ฆฌ ๋งํ๋ฉด ํ์ํ ์ต์ ๊ฐ์ (Edge) ๊ฐ์๋ก ํํ์ด ๊ฐ๋ฅํฉ๋๋ค.
BFS๋ ์์์ ์์ ๊ฐ๊น์ด ์ ๋ค๋ถํฐ ํ์์ด ๋๊ธฐ ๋๋ฌธ์ ํ์ํ๋ ๊ณผ์ ์์ ์ฌ์ฉ๋๋ ๊ฐ์ ์ ๊ฐ์๋ฅผ ์ฒดํฌํด ๋์๊ฐ๋ฉด ๊ทธ๋ํ์ ์ ์ ์ ๊ฐ์ค์น๊ฐ ๋ชจ๋ ๋์ผํ ๊ฒฝ์ฐ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ O(V+E)์ ๊ตฌํ ์ ์์ต๋๋ค.