๐ ๊ทธ๋ํ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
DFS์ BFS๋ฅผ ๊ณต๋ถํ๊ธฐ ์์, ๊ทธ๋ํ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ๋จผ์ ์์๋ณด์.
๊ทธ๋ํ๋ ๋ ธ๋(Node)์ ๊ฐ์ (Edge)๋ก ํํ๋๋ฉฐ, ์ด๋ ๋ ธ๋๋ฅผ ์ ์ (Vertex)๋ผ๊ณ ๋ ํ๋ค.
๊ทธ๋ํ ํ์์ด๋ ํ๋์ ๋ ธ๋๋ฅผ ์์์ผ๋ก ๋ค์์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ ๋งํ๋ค.
๋ํ, ๋ ๋ ธ๋๊ฐ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋์ด ์๋ค๋ฉด '๋ ๋ ธ๋๋ ์ธ์ ํ๋ค(Adjacent)'๋ผ๊ณ ํํํ๋ค.
ํ๋ก๊ทธ๋๋ฐ์์๋ ๊ทธ๋ํ๋ฅผ ํฌ๊ฒ 2๊ฐ์ง ๋ฐฉ์์ผ๋ก ํํํ ์ ์๋๋ฐ, ์ฝ๋ฉ ํ ์คํธ์์๋ ํ์ํ ๊ฐ๋ ์ด๋ ๊ผญ ์์งํ๋๋ก ํ์.
1. ์ธ์ ํ๋ ฌ(Adjacency Matrix)
2์ฐจ์ ๋ฐฐ์ด๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ์
์ธ์ ํ๋ ฌ ๋ฐฉ์์ 2์ฐจ์ ๋ฐฐ์ด์ ๊ฐ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ํํ๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฉ์์ด๋ค. ์์ ๊ฐ์ ์์ ๊ทธ๋ํ๊ฐ ์๋ค๊ณ ํ์ ๋, ์ด๋ฅผ ์ธ์ ํ๋ ฌ๋ก ํํํ๋ฉด ์๋ ํ์ฒ๋ผ ๋ํ๋ผ ์ ์๋ค. ์ฐ๊ฒฐ์ด ๋์ด ์์ง ์์ ๋ ธ๋๋ผ๋ฆฌ๋ ๋ฌดํ(Infinity)์ ๋น์ฉ์ด๋ผ๊ณ ์์ฑํ๋ค.
0 | 1 | 2 | |
0 | 0 | 7 | 5 |
1 | 7 | 0 | ๋ฌดํ |
2 | 5 | ๋ฌดํ | 0 |
์ด๋ฅผ c++ ์ฝ๋๋ก ์์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
#include "iostream"
#define INF 999999999
using namespace std;
int graph[3][3] = {
{0, 7, 5},
{7, 0, INF},
{5, INF, 0}
};
int main(void) {
// ๊ทธ๋ํ ์ถ๋ ฅ
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
cout << graph[i][j] << ' ';
}
cout << '\n';
}
}
2. ์ธ์ ๋ฆฌ์คํธ(Adjacency List)
๋ฆฌ์คํธ๋ก ๊ทธ๋ํ์ ์ฐ๊ฒฐ ๊ด๊ณ๋ฅผ ํํํ๋ ๋ฐฉ์
์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์์๋ ๋ค์ ๊ทธ๋ฆผ์ฒ๋ผ ๋ชจ๋ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ ธ๋์ ๋ํ ์ ๋ณด๋ฅผ ์ฐจ๋ก๋๋ก ์ฐ๊ฒฐํด ์ ์ฅํ๋ค.
์ธ์ ๋ฆฌ์คํธ๋ '์ฐ๊ฒฐ ๋ฆฌ์คํธ'๋ผ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด ๊ตฌํํ๋ค.
(*ํ์ด์ฌ์ ๊ฒฝ์ฐ์๋ ๊ทธ๋ฅ ๋ฆฌ์คํธ ์๋ฃํ์ ์ฌ์ฉํ๋ฉด ๋๋ค.)
#include "iostream"
#include "vector"
using namespace std;
vector<pair<int, int> > graph[3];
int main(void) {
graph[0].push_back({1, 7});
graph[0].push_back({2, 5});
graph[1].push_back({0, 7});
graph[2].push_back({0, 5});
// ๊ทธ๋ํ ์ถ๋ ฅ
for (int i = 0; i < 3; i++) {
for (int j = 0; j < graph[i].size(); j++) {
cout << '(' << graph[i][j].first << ',' << graph[i][j].second << ')' << ' ';
}
cout << '\n';
}
}
์ด 2๊ฐ์ง ๋ฐฉ์์ ์ฐจ์ด์ ์ ๋ํด ์๊ฐํด๋ณด์.
๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์์ ๋ณด์๋ฉด, ์ธ์ ํ๋ ฌ ๋ฐฉ์์ ๋ชจ๋ ๊ด๊ณ๋ฅผ ์ ์ฅํ๋ฏ๋ก ๋ ธ๋ ๊ฐ์๊ฐ ๋ง์์๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถํ์ํ๊ฒ ๋ญ๋น๋๋ค. ๋ฐ๋ฉด ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ง์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ค.
ํ์ง๋ง, ์ด๋ฌํ ํน์ฑ ๋๋ฌธ์ ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ ์ธ์ ํ๋ ฌ ๋ฐฉ์์ ๋นํด ํน์ ํ ๋ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋์ด ์๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ์ป๋ ์๋๊ฐ ๋๋ฆฌ๋ค. ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์์๋ ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ผ ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก DFS์ BFS์ ๋ํด ์์๋ณด์!
๐ DFS๋?
DFS๋ Depth-First Search์ ์ฝ์๋ก, ๊น์ด ์ฐ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ ๋งํ๋ค. ์ฆ, ๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ํน์ ํ ๊ฒฝ๋ก์์ ์ต๋ํ ๊น์ ๊ณณ๊น์ง ๋ค์ด๊ฐ์ ์ ์ผ ๋ ๋ ธ๋(leaf node)๋ฅผ ๋ฐฉ๋ฌธํ ๋ค, ๋ค์ ๋ค๋ก ๋์๊ฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ก ํ์ํ๋ค.
DFS๋ ์คํ(Stack, LIFO Queue)๋ฅผ ์ฌ์ฉํ๋ค.
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด, 1๋ฒ ๋ ธ๋๋ถํฐ ์์ํด ์ฐ๊ฒฐ๋์ด ์๋ ๋ ธ๋ ์ค ๊ฐ์ฅ ์์ ์ซ์๋ถํฐ ๊น์ด ์ฐ์ ํ์์ ํ๋ ๊ณผ์ ์ ๋ณผ ์ ์๋ค. ์๊น์ด ์๋ ์ซ์๊ฐ ํ์ ์์์ด๋ค. ๋จ๊ณ๋ณ๋ก ์คํ์ ๋ณํ๋ 1 -> 1, 2 -> 1, 2, 7 -> 1, 2, 7, 6 -> 1, 2, 7 -> 1, 2, 7, 8 -> 1, 2, 7 -> 1, 2 -> 1 -> 1, 3 -> 1, 3, 4 -> 1, 3, 4, 5 -> 1, 3, 4 -> 1, 3 -> 1 -> null ์ด๋ ๊ฒ ๋๋ค.
#include "iostream"
#include "vector"
using namespace std;
bool visited[9];
vector<int> graph[9];
void dfs(int x) {
visited[x] = true;
for (int i = 0; i < graph[x].size(); i++) {
int y = graph[x][i];
if (!visited[y]) dfs(y);
}
}
// main ์๋ต
DFS๋ ์คํ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ์ดํ๋ค๋ ์ ์์ ๊ตฌํ์ด ๊ฐ๋จํ๋ค. ์ค์ ๋ก๋ ์คํ์ ์ฐ์ง ์์๋ ๋๋ฉฐ ํ์์ ์ํํจ์ ์์ด์ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ N๊ฐ์ธ ๊ฒฝ์ฐ์ O(N)์ ์๊ฐ์ด ์์๋๋ค๋ ํน์ง์ด ์๋ค. ๋ํ, ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํด ๊ตฌํํ์ ๋ ๋งค์ฐ ๊ฐ๊ฒฐํ๊ฒ ๊ตฌํํ ์ ์๋ค.
๐ BFS๋?
BFS๋ Breadth-First Search์ ์ฝ์๋ก, ๋๋น ์ฐ์ ํ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ฝ๊ฒ ๋งํด ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
BFS๋ FIFO Queue๋ฅผ ์ด์ฉํด ๊ตฌํํ ์ ์๋ค.
1๋ฒ ๋ ธ๋๋ถํฐ ์์ํด ์ธ์ ํ ๋ ธ๋๋ถํฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ด ํ์ํ๊ฒ ๋๋ค. ๋จ๊ณ๋ณ ํ์ ๋ณํ๋ 1 -> 2, 3, 8 -> 3, 8, 7 -> 8, 7, 4, 5 -> 7, 4, 5 -> 4, 5, 6 -> 5, 6 -> 6 -> null ์ด๋ ๊ฒ ๋๋ค.
#include "iostream"
#include "queue"
#include "vector"
using namespace std;
bool visited[9];
vector<int> graph[9];
void bfs(int start) {
queue<int> q;
q.push(start);
visited[start] = true;
while (!q.empty()) {
int x = q.front();
q.pop();
for (int i = 0; i < graph[x].size(); i++) {
int y = graph[x][i];
if (!visited[y]) {
q.push(y);
visited[y] = true;
}
}
}
}
// main ์๋ต
DFS ์ญ์ ํ ์๋ฃ๊ตฌ์กฐ์ ๊ธฐ์ดํ๋ค๋ ์ ์์ ๊ตฌํ์ด ๊ฐ๋จํ๋ฉฐ, c++์์๋ queue, python์์๋ deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. ํ์์ ์ํํ๋ ๋ฐ์ ์์ด O(n)์ ์๊ฐ์ด ์์๋๋ฉฐ, ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ ์ค์ ์ํ ์๊ฐ์ DFS๋ณด๋ค ์ข์ ํธ์ด๋ค.
์ฝ๋ฉํ ์คํธ ์ค 2์ฐจ์ ๋ฐฐ์ด์์์ ํ์ ๋ฌธ์ ๋ฅผ ๋ง๋๋ฉด ๋ฐฐ์ด์ ๊ทธ๋ํ ํํ๋ก ๋ฐ๊ฟ์ ์๊ฐํด๋ณด์.
๊ทธ๋ฌ๋ฉด ํ์ด ๋ฐฉ๋ฒ์ ์กฐ๊ธ ๋ ์ฝ๊ฒ ๋ ์ฌ๋ฆด ์ ์์ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด ๊ฒ์ ๋งต์ด 3X3 ํํ์ 2์ฐจ์ ๋ฐฐ์ด์ด๊ณ ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ขํ๋ผ๊ณ ์๊ฐํด๋ณด์.
์ด๋ ๊ฐ ์ขํ๋ฅผ ์ํ์ข์ฐ๋ก๋ง ์ด๋ํ ์ ์๋ค๋ฉด ์ํ์ข์ฐ๊ฐ ๊ฐ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๊ทธ๋ํ๋ก ์๊ฐํ ์ ์์ ๊ฒ์ด๋ค.