๐ป๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ
์ด๋ฒ์๋ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ์ฌ ๋ค๋ฃจ์ด ๋ณผ ๊ฒ์ด๋ค. ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ ํ ์ ์ ์์ ์์ํ์ฌ ์ฐจ๋ก๋๋ก ๊ทธ๋ํ์ ์๋ ๋ชจ๋ ์ ์ ๋ค์ ํ๋ฒ์ฉ ๋ฐฉ๋ฌธํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ปํ๋ค. ๋ง์ ๊ทธ๋ํ์ ๋ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์์์ผํ๋๋ฐ ์๋ฅผ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ํ์์ด ํ์ํ๋ค.
- ํ ์ ์ ๊ณผ ๋ค๋ฅธ ์ ์ ์ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ ๋
- ๊ทธ๋ํ๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง ํ์ธํ ๋
- ์ ์ฅ ํธ๋ฆฌ(Spanning Tree)๋ฅผ ์ฐพ์ ๋
๊ทธ๋ํ๋ฅผ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊ต์ฅํ ์ค์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ค์๋ค. ์๊ณ ๋ฆฌ์ฆ ์ฌ์ดํธ์ธ ํ๋ก๊ทธ๋๋จธ์ค์์ ๋ณด์์ ๋๋ ๊ทธ๋ํ ํ์์ด ์ถ์ ๋น๋์๋ ๋๊ณ ์ ๋ต๋ฅ ์ด ๋ฎ๊ฒ ๋์จ๋ค.
๋ํ์ ์ผ๋ก ๊น์ด ์ฐ์ ํ์(Depth-First Search)๊ณผ ๋๋น ์ฐ์ ํ์(Breadth-First Search)์ด ์กด์ฌํ๋ค. ์ค์ฌ์ ๊ฐ๊ฐ DFS์ BFS๋ผ๊ณ ๋ง์ด ๋ถ๋ฅธ๋ค.
๊ทธ๋ํ(Graph)๋ผ๋ ์๋ฃ๊ตฌ์กฐ์ ๋ํ ์์ธํ ์ค๋ช ์ ์๋์ ํฌ์คํ ์ ์ ์ ๋ฆฌํด ๋์๋ค.
๐ป๊น์ด ์ฐ์ ํ์(DFS)๊ณผ ๋๋น ์ฐ์ ํ์(BFS)
๊ทธ๋ํ๋ฅผ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๊น์ด ์ฐ์ ํ์๊ณผ ๋๋น ์ฐ์ ํ์์ผ๋ก ๋๋์ด ์ง๋ค. ๋ ์๊ณ ๋ฆฌ์ฆ์ ์์๋ณด์.
๐ก ๊น์ด ์ฐ์ ํ์(DFS - Depth-First Search)
์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ดํด๊ฐ ์ฌ์ธ ๊ฒ์ด๋ค. DFS์ ๊ธฐ๋ณธ ์๋ฆฌ๋ ๊ฐ ์ ์๋ ๋งํผ ์ต๋ํ ๊น์ด๊ฐ๊ณ , ๋์ด์ ๊ฐ๊ณณ์ด ์์ผ๋ฉด ์ด์ ์ ์ ์ผ๋ก ๋์๊ฐ๋ค๋ ๊ฒ์ด๋ค. ์ฝ๊ฒ ๋งํด์ ๊ทธ๋ฅ ์ธ๋ก๋ก ํ์ค์ฉ ์ฝ์ด ๋ด๋ ค๊ฐ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. stack๊ณผ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ค.
DFS์ ์ฅ/๋จ์
- ์ฅ์
- ํ ๊ฒฝ๋ก์์ ๋ ธ๋๋ค๋ง ๊ธฐ์ตํ๋ฉด ๋๋ฏ๋ก ์ ์ฅ๊ณต๊ฐ ์์๊ฐ ๋น๊ต์ ์ ๋ค.
- ๋ชฉํ ๋ ธ๋๊ฐ ๊น์ ๋จ๊ณ์ ์์ ๊ฒฝ์ฐ ํด๋ฅผ ๋นจ๋ฆฌ ๊ตฌํ ์ ์๋ค.
- ๋จ์
- ํด๊ฐ ์๋ ๊ฒฝ๋ก๊ฐ ๊น์ ๊ฒฝ์ฐ ํ์์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์๋ค.
- ์ป์ด์ง ํด๊ฐ ์ต๋จ ๊ฒฝ๋ก๊ฐ ๋๋ค๋ ๋ณด์ฅ์ด ์๋ค.
- ๊น์ด๊ฐ ๋ฌดํํ ๊น์ด์ง๋ฉด ์คํ์ค๋ฒํ๋ก์ฐ๊ฐ ๋ ์ํ์ด ์๋ค. (๊น์ด ์ ํ์ ๋๋ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ๊ฐ๋ฅ)
DFS์ ๊ตฌํ
๊ทธ๋ํ๋ฅผ ์ธ์ ํ๋ ฌ(adjacency matrix)๋ก ๊ตฌํํ๋์ง, ์ธ์ ๋ฆฌ์คํธ(adjacency list)๋ก ๊ตฌํํ๋ ์ง์ ๋ฐ๋ผ ๊ตฌํ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง๋ค.
- ์ธ์ ํ๋ ฌ๋ก ๊ตฌํํ์ ๊ฒฝ์ฐ
vector<vector<int>> adjacent; //์ธ์ ํ๋ ฌ๋ก ๊ตฌํ๋ ๊ทธ๋ํ ๋ค์ด๊ฐ
vector<bool> visited; // ๊ทธ๋ํ์ ์ ์ ๋งํผ์ ํฌ๊ธฐ๋ก ์์ฑ
void DFS(int now)
{
visited[now] = true;
int N = adjacent.size();
for (int i = 0; i < N; i++)
{
if (adjacent[now][i] == 0)
continue;
if (!visited[i])
DFS(i);
}
}
[์๊ฐ๋ณต์ก๋]
DFS ํ๋๋น N๋ฒ์ loop๋ฅผ ๋๊ฒ ๋๋ฏ๋ก O(n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ๊ทธ๋ฐ๋ฐ N๊ฐ์ ์ ์ ์ ๋ชจ๋ ๋ฐฉ๋ฌธ ํด์ผํ๋ฏ๋ก
n*O(n)์ด๋ฏ๋ก O(n^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
- ์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ์ ๊ฒฝ์ฐ
vector<vector<int>> adjacent; //์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํ๋ ๊ทธ๋ํ ๋ค์ด๊ฐ
vector<bool> visited; // ๊ทธ๋ํ์ ์ ์ ๋งํผ์ ํฌ๊ธฐ๋ก ์์ฑ
void DFS(int now)
{
visited[now] = true;
for (int i = 0; i < adjacent[now].size(); i++)
{
int next = adjacent[now][i];
if (!visited[next])
DFS(next);
}
}
[์๊ฐ๋ณต์ก๋]
DFS๊ฐ ์ด N๋ฒ ํธ์ถ๋๊ธด ํ์ง๋ง ์ธ์ ํ๋ ฌ๊ณผ ๋ฌ๋ฆฌ ์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ๊ฒ ๋๋ฉด DFSํ๋๋น ๊ฐ ์ ์ ์ ์ฐ๊ฒฐ๋์ด ์๋ ๊ฐ์ ์ ๊ฐ์๋งํผ ํ์์ ํ๊ฒ ๋๋ฏ๋ก ์์ธก์ด ๋ถ๊ฐ๋ฅ ํ๋ค. ํ์ง๋ง DFS๊ฐ ๋ค ๋๋ ํ๋ฅผ ์๊ฐํ๋ฉด, ๋ชจ๋ ์ ์ ์ ํ๋ฒ์ฉ ๋ค ๋ฐฉ๋ฌธํ๊ณ , ๋ชจ๋ ๊ฐ์ ์ ํ๋ฒ์ฉ ๋ชจ๋ ๊ฒ์ฌํ๋ค๊ณ ํ ์ ์์ผ๋ฏ๋ก O(n+e)์ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค๊ณ ํ ์ ์๋ค.
๋ฐ๋ผ์ ์๊ฐ๋ณต์ก๋๋ O(n+e)์ด๋ค.
๐ก ๋๋น ์ฐ์ ํ์(BFS - Breadth-First Search)
๋ง์ฐฌ๊ฐ์ง๋ก ์ค๋ฅธ์ชฝ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ดํด๊ฐ ์ฌ์ธ ๊ฒ์ด๋ค. BFS์ ๊ธฐ๋ณธ ์๋ฆฌ๋ queue๋ฅผ ์ด์ฉํ์ฌ ์ง๊ธ ์์น์ ๊ฐ ์ ์๋ ์ ์ ์ ๋ชจ๋ queue์ ๋ฃ๋ ๊ฒ์ด๋ค. ์ฝ๊ฒ ๋งํ๋ฉด DFS์๋ ์ ๋ฐ๋๋ก ๊ฐ๋ก๋ก ํ์ค์ฉ ์ฝ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. queue๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ค.
BFS์ ์ฅ/๋จ์
- ์ฅ์
- ๋๋น๋ฅผ ์ฐ์ ์ผ๋ก ํ์ํ๋ฏ๋ก ๋ต์ด ๋๋ ๊ฒฝ๋ก๊ฐ ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ์ป์ ์ ์๋ค.
- ๊ฒฝ๋ก๊ฐ ๋ฌดํํ ๊น์ด์ ธ๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๋ฐ๋์ ์ฐพ์ ์ ์๋ค.
- ๋ ธ๋ ์๊ฐ ์ ๊ณ ๊น์ด๊ฐ ์์ ํด๊ฐ ์กด์ฌํ ๋ ์ ๋ฆฌํ๋ค.
- ๋จ์
- DFS์ ๋ฌ๋ฆฌ ํ๋ฅผ ์ด์ฉํ์ฌ ๋ค์์ ํ์ํ ์ ์ ๋ค์ ์ ์ฅํ๋ฏ๋ก ๋ ํฐ ์ ์ฅ๊ณต๊ฐ์ด ํ์ํ๋ค.
BFS์ ๊ตฌํ
๊ทธ๋ํ๋ฅผ ์ธ์ ํ๋ ฌ(adjacency matrix)๋ก ๊ตฌํํ๋์ง, ์ธ์ ๋ฆฌ์คํธ(adjacency list)๋ก ๊ตฌํํ๋ ์ง์ ๋ฐ๋ผ ๊ตฌํ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง๋ค.
- ์ธ์ ํ๋ ฌ๋ก ๊ตฌํํ์ ๊ฒฝ์ฐ
vector<vector<int>> adjacent; //์ธ์ ํ๋ ฌ๋ก ๊ตฌํ๋ ๊ทธ๋ํ ๋ค์ด๊ฐ
vector<bool> discovered; // ๊ทธ๋ํ์ ์ ์ ๋งํผ์ ํฌ๊ธฐ๋ก ์์ฑ
void BFS(int now)
{
queue<int> q;
int N = adjacent.size();
q.push(now);
discovered[now] == true;
while(!q.empty())
{
now = q.front();
q.pop();
for (int i = 0; i < N; i++)
{
if (adjacent[now][i] == 0)
continue;
if (!discovered[i])
{
q.push(i);
discovered[i] = true;
}
}
}
}
[์๊ฐ๋ณต์ก๋]
์ ์ ํ๊ฐ๋น N๋ฒ์ for loop๋ฅผ ๋๊ธฐ ๋๋ฌธ์ O(n)์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ฐ ์ด for loop๋ ํ์ ์๋ฌด๊ฒ๋ ์์ ๋๊น์ง ์ฆ, ๋ชจ๋ ์ ์ ์ ๋ฐฉ๋ฌธํ ๋๊น์ง ์คํ๋๋ฏ๋ก n๋ฒ ๋ฐ๋ณต ์คํ๋๋ค. ๋ฐ๋ผ์ ์๊ฐ๋ณต์ก๋๋ O(n^2)์ด๋ค.
- ์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํํ์ ๊ฒฝ์ฐ
vector<vector<int>> adjacent; //์ธ์ ๋ฆฌ์คํธ๋ก ๊ตฌํ๋ ๊ทธ๋ํ ๋ค์ด๊ฐ
vector<bool> discovered; // ๊ทธ๋ํ์ ์ ์ ๋งํผ์ ํฌ๊ธฐ๋ก ์์ฑ
void BFS(int now)
{
queue<int> q;
q.push(now);
discovered[now] == true;
while(!q.empty())
{
now = q.front();
q.pop();
for (int i = 0; i < adjacent[now].size(); i++)
{
int next = adjacent[now][i];
if (!discovered[next])
{
q.push(next);
discovered[next] = true;
}
}
}
}
[์๊ฐ๋ณต์ก๋]
์๊น ๋ฆฌ์คํธ๋ก ๊ตฌํ๋ DFS์ ๋น์ทํ ๋ ผ๋ฆฌ๋ก ์๊ฐ๋ณต์ก๋๋ฅผ ๊ตฌํ ์ ์๋ค.
BFS๊ฐ ๋ค ๋๋ ํ๋ฅผ ์๊ฐํด๋ณด๋ฉด, ๋ชจ๋ ๊ฐ์ ์ ๋ํด์ ํ๋ฒ์ฉ ๊ฒ์ฌ๋ฅผ ํ ๊ฒ์ด๊ณ , ๊ฐ ์ ์ ์ ํ๋ฒ์ฉ ๋ชจ๋ ๋ฐฉ๋ฌธํ๊ธฐ ๋๋ฌธ์ O(n+e)๋งํผ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง ๊ฒ์ด๋ค.
๐ป๋ง์น๋ฉฐ
์ด๋ ๊ฒ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ธ DFS์ BFS์ ๋ํด์ ์์๋ณด์๋ค. ๋ ์๊ณ ๋ฆฌ์ฆ ๋ชจ๋ ์ธ์ ํ๋ ฌ์ ์ฌ์ฉํ์ฌ ๋ง๋ ๊ทธ๋ํ์ ๊ฒฝ์ฐ์๋ O(n^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ณ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ง๋ ๊ทธ๋ํ์ ๊ฒฝ์ฐ์๋ O(n+e)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค. ๋ ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ๋ณต์ก๋๋ ๊ฐ์ผ๋ฏ๋ก ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ ์๊ณ ์ํฉ์ ๋ฐ๋ผ ์ ์ ํ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ๋ ๊ฒ์ด ์ค์ํด ๋ณด์ธ๋ค.
DFS, BFS์๊ณ ๋ฆฌ์ฆ์ ๊ต์ฅํ ์ค์ํ ์๊ณ ๋ฆฌ์ฆ์ด๋ ๊ฒ์ ์ธ์งํ๊ณ ๊ณ์ํด์ ๋ฐ๋ณตํ์ต ํด๋๊ฐ์ผ ํ๋ค๊ณ ์๊ฐํ๋ค.
'CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ(Dijikstra's Algorithm) (0) | 2022.03.18 |
---|
๊ฒ์๊ฐ๋ฐ์๋ฅผ ๊ฟ๊พธ๋ ๋ํ์์ ๊ฐ๋ฐ ๊ณต๋ถ ๋ธ๋ก๊ทธ
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!