๊น์ด ์ฐ์ ํ์(Depth-First Search, DFS)
๊น์ด ์ฐ์ ํ์(DFS)์ ๊ทธ๋ํ ํ์ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋๋ก, ํ ์ ์ ์์ ์์ํ์ฌ ๊ฐ๋ฅํ ๊น์ด๊น์ง ํ์ํ ํ, ๋ ์ด์ ๊ฐ ๊ณณ์ด ์์ผ๋ฉด ๋๋์์ค๋ ๋ฐฉ์(๋ฐฑํธ๋ํน)์ผ๋ก ๋์ํฉ๋๋ค.
๐น DFS ๊ฐ๋
DFS๋ ์คํ(์ฌ๊ท ํธ์ถ or ๋ช ์์ ์คํ)์ ์ฌ์ฉํ์ฌ ๊ทธ๋ํ๋ฅผ ๊น๊ฒ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ๋จผ์ ํ์ฌ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ,
- ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ํด๋น ๋ ธ๋๋ก ์ด๋ํ์ฌ ํ์์ ๊ณ์ํจ.
- ๋ ์ด์ ๋ฐฉ๋ฌธํ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์ด์ ๋ ธ๋(๋ถ๋ชจ ๋ ธ๋)๋ก ๋์๊ฐ(๋ฐฑํธ๋ํน).
๐น DFS ๋์ ๋ฐฉ์
DFS์ ๊ธฐ๋ณธ ๋์ ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
- ํ์ฌ ๋
ธ๋์์ ๊ฐ ์ ์๋ ๋
ธ๋๋ฅผ ํ์ธ
- ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ํด๋น ๋ ธ๋๋ก ์ด๋
- ๋ฐฉ๋ฌธํ ๋ ธ๋๋ผ๋ฉด ์คํต
- ๋ ์ด์ ๋ฐฉ๋ฌธํ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์ด์ ๋ ธ๋๋ก ๋๋์๊ฐ
- ๋ชจ๋ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๋๊น์ง 2~3 ๊ณผ์ ๋ฐ๋ณต
๐น DFS ๊ตฌํ ๋ฐฉ๋ฒ
DFS๋ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค.
- ์ฌ๊ท(Recursive) ๋ฐฉ์
- ์คํ(Stack) ์ฌ์ฉ ๋ฐฉ์(๋ฐ๋ณต๋ฌธ)
๐ข 1. DFS ์ฌ๊ท(Recursive) ๋ฐฉ์ ๊ตฌํ (Python)
def dfs_recursive(graph, node, visited):
if node in visited: # ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ฒฝ์ฐ ์ข
๋ฃ
return
visited.add(node) # ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
print(node, end=" ") # ๋ฐฉ๋ฌธํ ๋
ธ๋ ์ถ๋ ฅ
for neighbor in graph[node]: # ์ธ์ ๋
ธ๋ ํ์
dfs_recursive(graph, neighbor, visited)
# ๊ทธ๋ํ (์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์)
graph = {
1: [2, 3],
2: [4, 5],
3: [6, 7],
4: [],
5: [],
6: [],
7: []
}
visited_set = set()
dfs_recursive(graph, 1, visited_set)
์ถ๋ ฅ:
1 2 4 5 3 6 7
๐ ์ฌ๊ท ๋ฐฉ์์ ์คํ์ ์ด์ฉํ ๊ฒ๊ณผ ๋์ผํ ์๋ฆฌ๋ก ๋์ํฉ๋๋ค.
๐ข 2. DFS ์คํ(Stack) ์ฌ์ฉ ๋ฐฉ์ ๊ตฌํ (๋ฐ๋ณต๋ฌธ)
def dfs_stack(graph, start):
visited = set()
stack = [start] # ์คํ ์ด๊ธฐํ
while stack:
node = stack.pop() # ์คํ์์ ๋
ธ๋ ๊บผ๋ด๊ธฐ
if node not in visited:
visited.add(node) # ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
print(node, end=" ")
# ์คํ์ ์ธ์ ๋
ธ๋๋ฅผ ์ถ๊ฐ (๋ฐ๋๋ก ๋ฃ์ผ๋ฉด ์์ ์ ์ง)
stack.extend(reversed(graph[node]))
# ๊ทธ๋ํ (์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์)
graph = {
1: [2, 3],
2: [4, 5],
3: [6, 7],
4: [],
5: [],
6: [],
7: []
}
dfs_stack(graph, 1)
์ถ๋ ฅ:
1 2 4 5 3 6 7
๐ ์คํ์ ์ฌ์ฉํ๋ฉด ์ฌ๊ท ์์ด DFS๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
๐น DFS vs BFS ์ฐจ์ด์
๋น๊ต ํญ๋ชฉ | DFS(Depth-First Search) | BFS(Breadth-First Search) |
ํ์ ๋ฐฉ์ | ์ต๋ํ ๊น์ด ํ์ ํ ๋ฐฑํธ๋ํน | ํ์ฌ ๋ ๋ฒจ(๋๋น)์์ ํ์ ํ ๋ค์ ๋ ๋ฒจ๋ก ์ด๋ |
์๋ฃ๊ตฌ์กฐ | ์คํ (or ์ฌ๊ท ํธ์ถ) | ํ (Queue) |
๊ฒฝ๋ก ํ์ | ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํ์ํด์ผ ํ๋ ๊ฒฝ์ฐ ์ ํฉ | ์ต๋จ ๊ฒฝ๋ก(๊ฐ์ค์น ์๋ ๊ทธ๋ํ) ํ์์ ์ ํฉ |
๊ตฌํ ๋์ด๋ | ๋น๊ต์ ๊ฐ๋จ | ์๋์ ์ผ๋ก ๋ณต์ก |
์ฌ์ฉ ์์ | ๋ฐฑํธ๋ํน(๋ฏธ๋ก ์ฐพ๊ธฐ, ํผ์ฆ ํด๊ฒฐ, ์กฐํฉ) | ์ต๋จ ๊ฒฝ๋ก ํ์ (๊ธธ ์ฐพ๊ธฐ, ๋คํธ์ํฌ ํ์) |
๐น DFS ์์ฉ ์ฌ๋ก
- ๊ทธ๋ํ ํ์
- ์ฐ๊ฒฐ ์์ ์ฐพ๊ธฐ, ๊ฒฝ๋ก ํ์
- ๋ฐฑํธ๋ํน ๋ฌธ์ ํด๊ฒฐ
- ํผ์ฆ ๋ฌธ์ (์: N-Queen ๋ฌธ์ )
- ์กฐํฉ(combination)๊ณผ ์์ด(permutation)
- ๋คํธ์ํฌ ์ฐ๊ฒฐ ์ฌ๋ถ ํ์ธ
- ๋คํธ์ํฌ ๊ทธ๋ํ์์ ์ฐ๊ฒฐ ์ฌ๋ถ ๊ฒ์ฌ
- ์ฌ์ดํด ๊ฒ์ถ
- ๋ฐฉํฅ/๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์์ ์ฌ์ดํด ์กด์ฌ ์ฌ๋ถ ํ์ธ
- ๋ฏธ๋ก ์ฐพ๊ธฐ (DFS ๊ธฐ๋ฐ ๋ฐฑํธ๋ํน)
- ํ ๊ฒฝ๋ก๋ฅผ ๋๊น์ง ํ์ํ ํ ๋ค๋ฅธ ๊ฒฝ๋ก ํ์
- ํ ๊ฒฝ๋ก๋ฅผ ๋๊น์ง ํ์ํ ํ ๋ค๋ฅธ ๊ฒฝ๋ก ํ์
๐น DFS ์๊ฐ ๋ณต์ก๋ & ๊ณต๊ฐ ๋ณต์ก๋
- ์๊ฐ ๋ณต์ก๋:
- ์ธ์ ๋ฆฌ์คํธ: O(V + E) (์ ์ V, ๊ฐ์ E)
- ์ธ์ ํ๋ ฌ: O(V²)
- ๊ณต๊ฐ ๋ณต์ก๋:
- O(V) (๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ๋ฐฐ์ด, ์คํ/์ฌ๊ท ํธ์ถ ์คํ)
๐น ์ฝ๋ฉ ํ
์คํธ ๋ฌธ์ (๋ฐฑ์ค 2023)
1. ๋ฌธ์ ์ค๋ช
์๋น์ด๊ฐ ์ธ์์์ ๊ฐ์ฅ ์ข์ํ๋ ๊ฒ์ ์์์ด๊ณ , ์ทจ๋ฏธ๋ ์์๋ฅผ ๊ฐ์ง๊ณ ๋
ธ๋ ๊ฒ์ด๋ค. ์์ฆ ์๋น์ด๊ฐ ๊ฐ์ฅ ๊ด์ฌ์์ด ํ๋ ์์๋ 7331์ด๋ค. 7331์ ์์์ธ๋ฐ, ์ ๊ธฐํ๊ฒ๋ 733๋ ์์์ด๊ณ , 73๋ ์์์ด๊ณ , 7๋ ์์์ด๋ค. ์ฆ, ์ผ์ชฝ๋ถํฐ 1์๋ฆฌ, 2์๋ฆฌ, 3์๋ฆฌ, 4์๋ฆฌ ์ ๋ชจ๋ ์์์ด๋ค! ์๋น์ด๋ ์ด๋ฐ ์ซ์๋ฅผ ์ ๊ธฐํ ์์๋ผ๊ณ ์ด๋ฆ ๋ถ์๋ค.
์๋น์ด๋ N์๋ฆฌ์ ์ซ์ ์ค์์ ์ด๋ค ์๋ค์ด ์ ๊ธฐํ ์์์ธ์ง ๊ถ๊ธํด์ก๋ค. N์ด ์ฃผ์ด์ก์ ๋, ์๋น์ด๋ฅผ ์ํด N์๋ฆฌ ์ ๊ธฐํ ์์๋ฅผ ๋ชจ๋ ์ฐพ์๋ณด์.(https://www.acmicpc.net/problem/2023)
(์ ํ ์๊ฐ 2์ด, 1<= N <= 8)
2. ์ฒ์์ ์ฌ์ฉํ ๋ฐฉ๋ฒ(C++ 17)
์ฒ์์๋ DFS๋ฌธ์ ๋ผ๋ ๊ฒ์ ๊นจ๋ซ์ง ๋ชปํ๊ณ , std::string์ ํ์ฉํด์ ๋ฌธ์ ๋ฅผ ํ์์ต๋๋ค. ์ด๊ธฐ ๋ฒ์ ์ ์ ํ์๊ฐ์ ํ์ฉ ๋๊ฒผ์ผ๋, 2์ ๋ฐฐ์๋ ์์๊ฐ ๋ ์ ์๋ค(2 ์ ์ธ) ๋ผ๋ ๊ท์น์ ๊นจ๋ซ๊ณ ์ง์๋ฅผ ์ ์ธํ์ 1850ms ๋ก ๊ฒจ์ฐ ํต๊ณผํ์ต๋๋ค. ํ์ง๋ง N์ด ์กฐ๊ธ์ด๋ผ๋ ๋์์ ๊ฒฝ์ฐ์๋ ๋ณต์ฌ์ฐ์ฐ๊ณผ ๋๋ถ์ด ์๊ฐ์ด ๋ง์ด ์์๋๋ ์ข์ง ์์ ์ฝ๋์์ต๋๋ค. ์ฐ์ ๋จผ์ ์ฝ๋๋ฅผ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค.
// ๋ฐฑ์ค 2023
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <cmath>
using namespace std;
bool isPrime(int num) {
if (num <= 1) return false; // 1 ์ดํ์ ์ซ์๋ ์์๊ฐ ์๋
if (num <= 3) return true; // 2์ 3์ ์์
if (num % 2 == 0 || num % 3 == 0) return false; // 2์ 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ฉด ์์๊ฐ ์๋
for (int i = 5; i * i <= num; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) return false;
}
return true;
}
int main()
{
int N;
cin >> N;
int min = pow(10, N-1);
int max = pow(10, N);
for (int i = min; i < max; i++)
{
if (i > 10 && i % 2 == 0)
continue;
bool isPrimeNumber = true;
string str = to_string(i);
for (int j = 0; j < str.length(); j++)
{
string strNum;
int idx = 0;
while (idx <= j)
strNum += str[idx++];
int target = stoi(strNum);
if (!isPrime(target))
{
isPrimeNumber = false;
break;
}
}
if (isPrimeNumber)
cout << i << endl;
}
}
3. DFS๋ฅผ ํ์ฉํ ์ต์ข ๋ฐฉ๋ฒ(C++ 17)
ํ๋ฌดํ๊ฒ๋ DFS๋ 0ms๊ฐ ๊ฑธ๋ ธ์ต๋๋ค. ์ผ์ ์๋ฆฌ์์ ์์๋ 2, 3, 5, 7 ๋ฟ์ด๊ณ ๊ทธ ์ดํ์ ์ฌ ์ ์๋ ์๋ 5๊ฐ(ํ์) ๋ฟ์ ๋๋ค. 2 -> 23, 23-> 233 -> 2337 ์ฒ๋ผ ๊น์ด ์ฐ์ ๋ฐฉ์์ผ๋ก ์์นํด๋๊ฐ๋ DFS๋ฅผ ํ์ฉํ๋ฉด ์ฝ๊ฒ ํ ์ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๋ฌธ์ ๋ฅผ ๋ณด๊ณ DFS๋ฅผ ํ์ฉํด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
// ๋ฐฑ์ค 2023
#include <iostream>
#include <vector>
using namespace std;
int N;
bool isPrime(int num) {
if (num <= 1) return false; // 1 ์ดํ์ ์ซ์๋ ์์๊ฐ ์๋
if (num <= 3) return true; // 2์ 3์ ์์
if (num % 2 == 0 || num % 3 == 0) return false; // 2์ 3์ผ๋ก ๋๋์ด ๋จ์ด์ง๋ฉด ์์๊ฐ ์๋
for (int i = 5; i * i <= num; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) return false;
}
return true;
}
void DFS(int num, int digit)
{
if (digit == N)
{
if (isPrime(num))
{
cout << num << endl;
return;
}
}
for (int i = 1; i < 10; i += 2)
{
int next = num * 10 + i;
if (isPrime(next))
DFS(next, digit + 1);
}
}
int main()
{
cin >> N;
DFS(2, 1);
DFS(3, 1);
DFS(5, 1);
DFS(7, 1);
}
๐น ์ ๋ฆฌ
- DFS๋ ์คํ(LIFO) ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ ๊ทธ๋ํ๋ฅผ ๊น์ด ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ฌ๊ท(Recursive) ๋ฐฉ์๊ณผ ์คํ(Stack) ๋ฐฉ์์ผ๋ก ๊ตฌํ ๊ฐ๋ฅ
- ๋ฐฑํธ๋ํน, ๋ฏธ๋ก ํ์, ๊ฒฝ๋ก ํ์ ๋ฑ ๋ค์ํ ๋ฌธ์ ํด๊ฒฐ์ ์ฌ์ฉ
- BFS์ ๋น๊ตํ๋ฉด ์ต๋จ ๊ฒฝ๋ก ํ์๋ณด๋ค๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ ๋ ์ ๋ฆฌํจ
DFS๊ฐ ํ์ํ ์ํฉ์ด๋ผ๋ฉด, ์ฌ๊ท ๋ฐฉ์๊ณผ ์คํ ๋ฐฉ์ ์ค ์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํด์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. ๐
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ธฐ๋ณธ] ๊ตฌ๊ฐํฉ ์์ฉ (0) | 2025.03.13 |
---|---|
[๊ธฐ๋ณธ] ์คํ ์๋ฃ๊ตฌ์กฐ ํ์ฉ (0) | 2025.03.10 |
[๊ธฐ๋ณธ] ํฉ๋ฐฐ์ด๊ณผ ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ (0) | 2025.03.08 |
์ฃผ์ ์๋ฃ๊ตฌ์กฐ์ ์๊ฐ๋ณต์ก๋ (0) | 2025.02.07 |
ํ๋ ธ์ด์ ํ ์ดํดํ๊ธฐ (1) | 2022.02.18 |
๋๊ธ