알고리즘 문제를 풀다보면 DFS 를 이용해야 하는 경우가 매우 많다. 보통은 recursion 을 이용하여 구현하지만 DFS 알고리즘은 stack 자료구조를 이용해서 구현할 수도 있다. 아래는 그 코드이다.

1. Recursion 을 이용한 DFS

void dfs(int x) {
  cout << x << " ";
  visited[x] = true;

  for(int i=0; i<adj[x].size(); i++) {
    int nx = adj[x][i];
    if(visited[nx]) continue;

    dfs(nx);
  }

  return;
}

2. Stack 을 이용한 DFS

void dfs(int x) {
  stack<int> s;

  s.push(x);

  while(!s.empty()) {
    int t = s.top();
    s.pop();

    if(visited[t]) continue;

    visited[t] = true;
    cout << t << " ";

    for(int i=adj[t].size()-1; i>=0; i--) {
      if(visited[adj[t][i]]) continue;
      s.push(adj[t][i]);
    }
  }

  return;
}


🙋‍♂️ BFS 와는 다르게 stackpush 하는 순간에 방문 처리를 하지 않고 pop 되는 순간에 방문 처리를 한다. recursionfunction callstack 구조로 발생함을 생각하고 비교해가며 생각해보자

Leave a comment