[ κ·Έλνμ νμ ]
- κ·Έλνμ νμ
β νλμ μ μ μΌλ‘λΆν° μμνμ¬ μ°¨λ‘λλ‘ λͺ¨λ μ μ λ€μ νλ²μ© λ°©λ¬Ένμ¬ νμνλ κ²
λ§μ λ¬Έμ λ€μ΄ λ¨μ κ·Έλνμ λ Έλ(μ μ )λ₯Ό νμνλ κ²μΌλ‘ ν΄κ²° κ°λ₯ν¨
- νμ λ°©λ²
β κΉμ΄ μ°μ νμ ( DFS : Depth First Search )
λλΉ μ°μ νμ ( BFS : Breath First Search )



[ κΉμ΄ μ°μ νμ (DFS) ]
- κΉμ΄ μ°μ νμ (DFS)
β νΈλ¦¬λ κ·Έλνμμ ν 루νΈλ‘ νμνλ€κ° νΉμ μν©μμ μ΅λν κΉμ΄ λ€μ΄κ°μ νμΈν λ€ λ€μ λμκ° λ€λ₯Έ 루νΈλ‘ νμνλ νμ λ°©λ²μ΄λ€.
μ£Όλ‘ μ€νμ μ¬μ©νμ¬ κ΅¬ν, λ¨μ νμ μλ μ체λ λλΉ μ°μ νμ (BFS)μ λΉν΄ λλ¦Ό.
νμμ΄ μλ μνλ₯Ό ν κ²½μ° μμ£Ό μ¬μ©νλ€
β κ°λ¦ΌκΈΈμ΄ λνλ λλ§λ€ 'λ€λ₯Έ κΈΈ'μ μ λ³΄λ§ κΈ°λ‘νλ©° μ§λμ¨ κΈΈμ μ§μ΄λ€
β‘ λ μ΄μ κ° μ μκ² λλ©΄ μ§μ μ κ°λ¦ΌκΈΈκΉμ§ λμκ°λ©° νμ¬ λ£¨νΈλ μλλΌλ νμμ λ¨κΈ΄λ€.
β’ κ°λ¦ΌκΈΈμ μμ°¨μ μΌλ‘ νμνλ©° λ°λ³΅νλ€.
β£ νμμ μ±κ³΅ν κ²½μ° μ’ λ£νλ€.
- κΉμ΄ μ°μ νμ (DFS) μ₯/λ¨μ
β μ₯μ : ν κ²½λ‘μμ λ Έλλ§μ κΈ°μ΅νλ―λ‘ μ μ₯ 곡κ°μ μμκ° λΉκ΅μ μ μ
νμ λͺ©νμ λ Έλκ° κΉμ λ¨κ³μ μμ κ²½μ° λΉ λ₯΄κ² νμ κ°λ₯
λ¨μ : ν΄κ° μλ κ²½λ‘μ κΉμ΄ λΉ μ§ κ°λ₯μ±μ΄ μμ. (μ΄λ΄ κ²½μ° λ―Έλ¦¬ μ§μ ν μμ κΉμ΄κΉμ§λ§ νμ ν μ€ν¨ν κ²½μ° λ€μ κ²½λ‘ νμνλ λ°©λ² μ¬μ©)
μ»μ΄μ§ ν΄κ° μ΅λ¨ κ²½λ‘κ° λλ€λ 보μ₯μ΄ μμ (DFS λ°©μμ ν΄μ λ€λ€λ₯΄λ κ²½μ° νμμ μ’ λ£νλ―λ‘ μ΅μ μ΄ μλ κ°λ₯μ± μμ)
- DFS μκ³ λ¦¬μ¦ λ³΅μ‘λ [ V : λ Έλ μ / E : κ°μ μ ]
β μκ° λ³΅μ‘λ : O(V + E)
κ³΅κ° λ³΅μ‘λ : O(V)
- DFS μκ³ λ¦¬μ¦
β DFSμ ꡬνμ κ·Έλν κ° μ μ μ λ°©λ¬Έ μ¬λΆλ₯Ό νμΈνλ κ²μΌλ‘ λΆλ₯νλ€.
β μ€νμ μ΅μλ¨μ κ·Έλνμ μ μ μ€ νλλ₯Ό λ°°μΉνλ€
β‘ μ€νμ topμ μλ μ μ μ κ°μ Έμ λ°©λ¬Έ λͺ©λ‘μ μΆκ°νλ€.
β’ ν΄λΉ μ μ μ μΈμ λ Έλ λͺ©λ‘μ μμ±, λ°©λ¬Έ λͺ©λ‘μ μλ κ²μ μ€νμ μλ¨μ μΆκ°νλ€.
β£ μ€νμ΄ λΉμ΄ μμ λκΉμ§ β‘μ β’ λ°λ³΅.






[ κΉμ΄ μ°μ νμ (DFS) μκ³ λ¦¬μ¦ κ΅¬ν ]
// C code
// μΈμ νλ ¬λ‘ ννλ 무ν₯ κ·Έλνμ DFS ꡬν
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAX_VERTICES 50
int visited[MAX_VERTICES]; // λ°©λ¬Έ μ¬λΆλ₯Ό νμΈνκΈ° μν λ°°μ΄
typedef struct GraphType {
int n; // μ μ μ κ°μ
int adj_mat[MAX_VERTICES][MAX_VERTICES];
} GraphType;
// κ·Έλν μ΄κΈ°ν
void init(GraphType* g) {
int r, c;
g->n = 0;
for (r = 0; r < MAX_VERTICES; r++)
for (c = 0; c < MAX_VERTICES; c++)
g->adj_mat[r][c] = 0;
}
// μ μ μ½μ
μ°μ°
void insert_vertex(GraphType* g, int v) {
if (((g->n) + 1) > MAX_VERTICES) {
fprintf(stderr, "κ·Έλν: μ μ μ κ°μ μ΄κ³Ό");
return;
}
g->n++;
}
// κ°μ μ½μ
μ°μ°
void insert_edge(GraphType* g, int start, int end) {
if (start >= g->n || end >= g->n) {
fprintf(stderr, "κ·Έλν: μ μ λ²νΈ μ€λ₯");
return;
}
g->adj_mat[start][end] = 1;
g->adj_mat[end][start] = 1;
}
// μΈμ νλ ¬λ‘ ννλ κ·Έλνμ λν κΉμ΄ μ°μ νμ
void dfs_mat(GraphType* g, int v) {
int w;
visited[v] = TRUE; // μ μ vμ λ°©λ¬Έ 체ν¬
printf("μ μ %d -> ", v); // λ°©λ¬Έν μ μ μΆλ ₯
for (w = 0; w < g->n; w++) // μΈμ λ
Έλ νμ
if (g->adj_mat[v][w] && !visited[w])
dfs_mat(g, w); //μ μ wμμ DFS μλ‘ μμ
}
int main(void){
GraphType* g = (GraphType*)malloc(sizeof(GraphType));;
init(g);
for (int i = 0; i < 5; i++)
insert_vertex(g, i);
insert_edge(g, 0, 1);
insert_edge(g, 0, 2);
insert_edge(g, 0, 3);
insert_edge(g, 1, 2);
insert_edge(g, 2, 4);
printf("<κΉμ΄ μ°μ νμ (DFS)>\n");
dfs_mat(g, 0);
printf("\n");
free(g);
return 0;
}
[ λλΉ μ°μ νμ (BFS) ]
- λλΉ μ°μ νμ (BFS)
β μμ μ μ μΌλ‘λΆν° μΈμ ν λ Έλλ₯Ό λ¨Όμ νμ, λ©λ¦¬ λ¨μ΄μ Έ μλ λ Έλλ₯Ό λμ€μ λ°©λ¬Ένλ νμλ°©λ².
μ£Όλ‘ νλ₯Ό μ¬μ©νμ¬ κ΅¬ν.
β λ£¨νΈ λ Έλμμ μμ
β‘ λ£¨νΈ λ Έλμ μΈμ λ Έλλ€μ λͺ©λ‘μ νμ μ μ₯
β’ μΈμ λ Έλ λͺ©λ‘μ λ Έλλ€μ μ°¨λ‘λ‘ λ°©λ¬Έ
β£ β’λ² κ³Όμ μ μΈμ λ Έλ λ°©λ¬Έμ ν΄λΉ μΈμ λ Έλμ μΈμ λ Έλ(λ°©λ¬Ένμ§ μμ) λͺ©λ‘μ νμ μ μ₯
β€ ν΄λΉ κ³Όμ μ λ°λ³΅, λͺ¨λ λ Έλ λ°©λ¬Έμ νμ μ’ λ£
- λλΉ μ°μ νμ (BFS) μ₯/λ¨μ
β μ₯μ : μ¬λ¬ κ°λ μ€ λ¬΄νν κΈΈμ΄λ₯Ό κ°μ§λ κ²½λ‘κ° μ‘΄μ¬νλ©° νμ λͺ©νκ° λ€λ₯Έ κ²½λ‘μ μ‘΄μ¬ν κ²½μ°
DFSμ κ²½μ° νμ λΆκ°λ₯νμ§λ§ BFSμ κ²½μ° λͺ¨λ κ²½λ‘λ₯Ό λμμ νμνκΈ° λλ¬Έμ νμ κ°λ₯
λ Έλμ μκ° μ κ±°λ κΉμ΄κ° μμμλ‘ νμμ μ 리(μ΅μ μ μν©μμ μ΅μ μ νμ κ°λ₯)
λ¨μ κ²μ μλλ κΉμ΄ μ°μ νμ(DFS) λ³΄λ€ λΉ λ¦
λλΉλ₯Ό μ°μ μ μΌλ‘ νμνκΈ°μ νμ μ μ μΌλ‘μ κ²½λ‘κ° μ¬λ¬κ° μΌμ§λΌλ μ΅λ¨ κ²½λ‘λ₯Ό 보μ₯ κ°λ₯
μ΅λ¨ κ²½λ‘κ° μ‘΄μ¬ν κ²½μ° μ΄λ ν κ²½λ‘κ° λ¬΄νν κΉμ΄μ§λλΌλ μ΅λ¨ κ²½λ‘ νμ κ°λ₯
λ¨μ : μ¬κ·νΈμΆμ μ΄μ©νλ DFSμ λ¬λ¦¬ νμ λ€μ νμ λ Έλλ€μ μ μ₯νλ―λ‘ μ μ₯ 곡κ°μ μλμ μΌλ‘ λ§μ΄ μ¬μ©
λ Έλμ μκ° λ§κ±°λ κΉμ΄κ° κΉμμλ‘ νμμ λΆλ¦¬ν¨
- BFS μκ³ λ¦¬μ¦ λ³΅μ‘λ [ V : λ Έλ μ / E : κ°μ μ ]
β μκ° λ³΅μ‘λ : O(V + E)
κ³΅κ° λ³΅μ‘λ : O(V)
- BFS μκ³ λ¦¬μ¦
β BFSμ ꡬν λν κ·Έλν κ° μ μ μ λ°©λ¬Έ μ¬λΆλ₯Ό ν΅ν΄ λΆλ₯
β μμ μ μ μ μΈμ λ Έλλ€μ νμ μ μ₯
β‘ νμ μ μ₯λ λ Έλ FRONTμ μμΉν λ Έλλ₯Ό λ°©λ¬Έ, ν΄λΉ λ Έλμ λ°©λ¬Ένμ§ μμ μΈμ λ Έλκ° μ‘΄μ¬ν κ²½μ° νμ νλ¨μ ν΄λΉ λ Έλ μ½μ
β’ νκ° μ λΆ λΉκ±°λ λ°©λ¬Έ λͺ©λ‘μ΄ μ λΆ μ°° λ κΉμ§ β‘λ² λ°λ³΅.






[ λλΉ μ°μ νμ (BFS) μκ³ λ¦¬μ¦ κ΅¬ν ]
// C code
// μΈμ νλ ¬λ‘ ννλ 무ν₯ κ·Έλνμ BFS ꡬν
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAX_QUEUE_SIZE 10
typedef int element;
typedef struct { // ν νμ
element queue[MAX_QUEUE_SIZE];
int front, rear;
} QueueType;
// μ€λ₯ κ²μ¦ ν¨μ
void error(char* message) {
fprintf(stderr, "%s\n", message);
exit(1);
}
// ν μ΄κΈ°ν ν¨μ
void queue_init(QueueType* q) {
q->front = q->rear = 0;
}
// 곡백 μν κ²μ¦ ν¨μ
int is_empty(QueueType* q) {
return (q->front == q->rear);
}
// ν¬ν μν κ²μ¦ ν¨μ
int is_full(QueueType* q) {
return ((q->rear + 1) %
MAX_QUEUE_SIZE == q->front);
}
// ν μ½μ
ν¨μ
void enqueue(QueueType* q, element item) {
if (is_full(q))
error("νκ° ν¬νμνμ
λλ€");
q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
q->queue[q->rear] = item;
}
// ν μμ ν¨μ
element dequeue(QueueType* q) {
if (is_empty(q))
error("νκ° κ³΅λ°±μνμ
λλ€");
q->front = (q->front + 1) % MAX_QUEUE_SIZE;
return q->queue[q->front];
}
#define MAX_VERTICES 50
typedef struct GraphType {
int n; // μ μ μ κ°μ
int adj_mat[MAX_VERTICES][MAX_VERTICES];
} GraphType;
int visited[MAX_VERTICES];
// κ·Έλν μ΄κΈ°ν ν¨μ
void graph_init(GraphType* g) {
int r, c;
g->n = 0;
for (r = 0; r < MAX_VERTICES; r++)
for (c = 0; c < MAX_VERTICES; c++)
g->adj_mat[r][c] = 0;
}
// μ μ μ½μ
μ°μ°
void insert_vertex(GraphType* g, int v) {
if (((g->n) + 1) > MAX_VERTICES) {
fprintf(stderr, "κ·Έλν: μ μ μ κ°μ μ΄κ³Ό");
return;
}
g->n++;
}
// κ°μ μ½μ
μ°μ°
void insert_edge(GraphType* g, int start, int end) {
if (start >= g->n || end >= g->n) {
fprintf(stderr, "κ·Έλν: μ μ λ²νΈ μ€λ₯");
return;
}
g->adj_mat[start][end] = 1;
g->adj_mat[end][start] = 1;
}
// μΈμ νλ ¬λ‘ ννλ κ·Έλνμ λν λλΉ μ°μ νμ
void bfs_mat(GraphType* g, int v) {
int w;
QueueType q;
queue_init(&q); // ν μ΄κΈ°ν
visited[v] = TRUE; // μ μ v λ°©λ¬Έ νμ
printf("%d λ°©λ¬Έ -> ", v);
enqueue(&q, v); // μμ μ μ μ νμ μ μ₯
while (!is_empty(&q)) {
v = dequeue(&q); // νμ μ μ μΆμΆ
for (w = 0; w < g->n; w++ // μΈμ μ μ νμ
if (g->adj_mat[v][w] && !visited[w]) {
visited[w] = TRUE; // λ°©λ¬Έ νμ
printf("%d λ°©λ¬Έ -> ", w);
enqueue(&q, w); // λ°©λ¬Έν μ μ μ νμ μ μ₯
}
}
}
int main(void)
{
GraphType* g;
int i;
g = (GraphType*)malloc(sizeof(GraphType));
graph_init(g);
for (i = 0; i < 5; i++)
insert_vertex(g, i);
insert_edge(g, 0, 1);
insert_edge(g, 0, 2);
insert_edge(g, 0, 3);
insert_edge(g, 1, 2);
insert_edge(g, 2, 4);
printf("γ λλΉ μ°μ νμ (BFS) γ\n");
bfs_mat(g, 0);
printf("\n");
free(g);
return 0;
}