DFS - KimTaebin-ai/study_posts GitHub Wiki
: ๋ค์ฐจ์ ๋ฐฐ์ด์์ ๊ฐ ์นธ์ ๋ฐฉ๋ฌธํ ๋ ๊น์ด๋ฅผ ์ฐ์ ์ผ๋ก ๋ฐฉ๋ฌธํ๋ ์๊ณ ๋ฆฌ์ฆ
- ์์ํ๋ ์นธ์ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธํ๋ค๋ ํ์๋ฅผ ๋จ๊น
- ์คํ์์ ์์๋ฅผ ๊บผ๋ด์ด ๊ทธ ์นธ๊ณผ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ์ ๋ํด 3๋ฒ์ ์งํ
- ํด๋น ์นธ์ ์ด์ ์ ๋ฐฉ๋ฌธํ๋ค๋ฉด ์๋ฌด ๊ฒ๋ ํ์ง ์๊ณ , ์ฒ์์ผ๋ก ๋ฐฉ๋ฌธํ๋ค๋ฉด ๋ฐฉ๋ฌธํ๋ค๋ ํ์๋ฅผ ๋จ๊ธฐ๊ณ ํด๋น ์นธ์ ์คํ์ ์ฝ์
- ์คํ์ด ๋น ๋๊น์ง 2๋ฒ์ ๋ฐ๋ณต
๋ชจ๋ ์นธ์ด ์คํ์ 1๋ฒ์ฉ ๋ค์ด๊ฐ๋ฏ๋ก ์๊ฐ๋ณต์ก๋๋ ์นธ์ด N๊ฐ์ผ ๋ O(N)
๊ฒฐ๊ตญ DFS์ BFS๋ ํฌ๊ฒ ์คํ์ ์ขํ๋ฅผ ๋ฃ๋, ํ์ ์ขํ๋ฅผ ๋ฃ๋๋ก ๊ตฌ๋ถ ์ง์ ์ ์๋ค.
#include <stdio.h>
#define MAX 502
typedef struct
{
int x;
int y;
} LocationPoint;
typedef struct
{
LocationPoint data[MAX * MAX];
int top;
} Stack;
int board[MAX][MAX] = {
{1, 1, 1, 0, 1, 0, 0, 0, 0, 0},
{1, 0, 0, 0, 1, 0, 0, 0, 0, 0},
{1, 1, 1, 0, 1, 0, 0, 0, 0, 0},
{1, 1, 0, 0, 1, 0, 0, 0, 0, 0},
{0, 1, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
int n = 7, m = 10;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1}; // ์ํ์ข์ฐ
int visit[MAX][MAX] = {0}; // ํด๋น ์นธ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ ์ฅ
void initStack(Stack *s) // ์คํ์ top ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ
{
s->top = 0;
}
void push(Stack *s, LocationPoint p)
{
s->data[s->top++] = p;
}
int empty(Stack *s)
{
return s->top == 0;
}
LocationPoint pop(Stack *s)
{
return s->data[--s->top];
}
int main()
{
Stack S;
initStack(&S);
visit[0][0] = 1; // 1. ์๊ณ ๋ฆฌ์ฆ ์์ ์ (0, 0) ๋ฐฉ๋ฌธ ํ์
push(&S, (LocationPoint){0, 0}); // 2. ํด๋น ์นธ์ ์คํ์ ๋ฃ๋๋ค.
while (!empty(&S))
{
LocationPoint current = pop(&S); // 3. ์ด๊ธฐ ์ธํ
ํ ์คํ์ด ๋น ๋๊น์ง ์คํ์ top์ ๋นผ์ค
printf("(%d, %d) -> ", current.x, current.y);
// 4. ํด๋น ์ขํ์ ์ํ์ข์ฐ๋ฅผ ์ดํด๋ณด๋ฉฐ ์คํ์ ๋ฃ๋๋ค
for (int dir = 0; dir < 4; dir++) // ์ํ์ข์ฐ ์ดํด๋ณด๊ธฐ
{
int nX = current.x + dx[dir];
int nY = current.y + dy[dir]; // nx, ny์ dir์์ ์ ํ ๋ฐฉํฅ์ ์ธ์ ํ ์นธ์ ์ขํ๊ฐ ๋ค์ด๊ฐ
if (nX < 0 || nX >= n || nY < 0 || nY >= m) // ๋ฒ์ ๋ฐ์ผ ๊ฒฝ์ฐ ๋์ด๊ฐ
continue;
if (visit[nX][nY] || board[nX][nY] != 1) // ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์นธ์ด๊ฑฐ๋ 0์ธ ๊ฒฝ์ฐ
continue;
visit[nX][nY] = 1; // ์กฐ๊ฑด์ ๊ฑธ๋ฆฌ์ง ์๋๋ค๋ฉด ๋ฐฉ๋ฌธ ๊ฐ๋ฅ, ๋ฐฉ๋ฌธํ์์ ์ ์ฅ
push(&S, (LocationPoint){nX, nY}); // ํด๋น ์ขํ๋ฅผ ์คํ์ ๋ฃ์ด์ค
}
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 1001
#define MAX_M 10001
int N, M, V;
int graph[MAX_N][MAX_N];
int visited[MAX_N];
// ํ ๊ตฌํ
typedef struct
{
int items[MAX_M];
int front;
int rear;
} Queue;
void initQueue(Queue *q)
{
q->front = -1;
q->rear = -1;
}
int isEmpty(Queue *q)
{
return q->front == -1;
}
void enqueue(Queue *q, int value)
{
if (q->rear == MAX_M - 1)
return;
if (isEmpty(q))
q->front = 0;
q->rear++;
q->items[q->rear] = value;
}
int dequeue(Queue *q)
{
if (isEmpty(q))
return -1;
int item = q->items[q->front];
q->front++;
if (q->front > q->rear)
initQueue(q);
return item;
}
// DFS ๊ตฌํ
void dfs(int v)
{
visited[v] = 1;
printf("%d ", v);
for (int i = 1; i <= N; i++)
{
if (graph[v][i] && !visited[i])
{
dfs(i);
}
}
}
// BFS ๊ตฌํ
void bfs(int start)
{
Queue q;
initQueue(&q);
visited[start] = 1;
enqueue(&q, start);
while (!isEmpty(&q))
{
int v = dequeue(&q);
printf("%d ", v);
for (int i = 1; i <= N; i++)
{
if (graph[v][i] && !visited[i])
{
visited[i] = 1;
enqueue(&q, i);
}
}
}
}
int main()
{
scanf("%d %d %d", &N, &M, &V);
for (int i = 0; i < M; i++)
{
int a, b;
scanf("%d %d", &a, &b);
graph[a][b] = graph[b][a] = 1;
}
// DFS
printf("DFS: ");
dfs(V);
printf("\n");
// ๋ฐฉ๋ฌธ ๋ฐฐ์ด ์ด๊ธฐํ
for (int i = 1; i <= N; i++)
visited[i] = 0;
// BFS
printf("BFS: ");
bfs(V);
printf("\n");
return 0;
}