프로그래밍/코딩테스트
[탐색] 깊이 우선 탐색(DFS)
코드몬스터
2023. 7. 31. 17:32
728x90
💡 먼저 부족하지만 저의 글을 읽어주셔서 감사드립니다!!!
참고 정도로 해주셨으면 좋겠습니다.
해당 강의는 여기 사이트 입니다.
깊이 우선 탐색(Depth-First Search)
- 하나의 노드에서 시작해 마지막 지점까지 계속 그래프를 탐색
- 미로찾기, 당신을 알 수 있는 친구 찾기 등
내가 강의를 들으면서 생각한 중요한 부분은
- 노드(node)라고 불리는 각 지점들과 지점들을 연결하는 간선(edge) 이다.
- 인접행렬의 1과 0 즉, 연결이 되어있으면 1 아니면 0을 이해하면 된다.!
이미지에서와 같이 0부터시작하여 1번 → 3번 → 4번 → 2번 순서대로 간다.
여기서 어떻게 우리는 1번에서 3번 4번으로 갈 수 있을까 생각하는데 코드를 한 번 봤으면 좋겠다.
if (!visited[next] && Graph[curr][next] != 0) {
mystack.push(next);
}
조건문에서 첫 번째 조건 방문의 여부와 간선(line)이 있는지 여부의 두 번째 조건으로 판단할 수 있다.
👉 재귀호출
public class App {
static final int MAX_N = 10;
static int vertex, line; // 각각의 노드와 간선
static int[][] Graph = new int[MAX_N][MAX_N]; // 인접행렬 0과 1
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
vertex = sc.nextInt();
line = sc.nextInt();
for (int i = 0; i < line; i++) {
int u = sc.nextInt();
int v = sc.nextInt();
Graph[u][v] = Graph[v][u] = 1;
}
dfs(0);
}
public static void dfs(int node) {
boolean[] visited = new boolean[MAX_N];
Stack<Integer> mystack = new Stack<>();
mystack.push(vertex);
while (!mystack.empty()) {
int curr = mystack.pop();
if (visited[curr]) continue;
visited[curr] = true;
System.out.println(curr + " ");
for (int next = 0; vertex < next; next++) {
if (!visited[next] && Graph[curr][next] != 0) {
mystack.push(next);
}
}
}
}
}
👉 Stack
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
vertex = sc.nextInt();
line = sc.nextInt();
for (int i = 0; i < line; i++) {
int u = sc.nextInt();
int v = sc.nextInt();
Graph[u][v] = Graph[v][u] = 1;
}
dfs(0);
}
public static void dfs(int node) {
boolean[] visited = new boolean[MAX_N];
Stack<Integer> mystack = new Stack<>();
mystack.push(vertex);
while (!mystack.empty()) {
int curr = mystack.pop();
if (visited[curr]) continue;
visited[curr] = true;
System.out.println(curr + " ");
for (int next = 0; vertex < next; next++) {
if (!visited[next] && Graph[curr][next] != 0) {
mystack.push(next);
}
}
}
}
}