🧑🏻💻 DFS - 깊이 우선 탐색
- 재귀함수로 구현되며 스택구조를 가진다.
- 시간 복잡도는 O(V+E)로 노드 수 + 에지 수로 구한다.
문제
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static ArrayList<Integer>[] A;
static Boolean visited[];
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
A = new ArrayList[n+1];
visited = new Boolean[n + 1];
Arrays.fill(visited, false);
for (int i = 1; i < n + 1; i++) {
A[i] = new ArrayList<Integer>();
}
for (int i = 0; i < m; i++) {
st = new StringTokenizer(bf.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
A[s].add(e);
A[e].add(s);
}
int count = 0;
for (int i = 1; i < n + 1; i++) {
if (!visited[i]) {
count++;
DFS(i);
}
}
System.out.println(count);
}
static void DFS(int v) {
if (visited[v]) {
return;
}
visited[v] = true;
for (int i : A[v]) {
if (visited[i] == false) {
DFS(i);
}
}
}
}
!visited[i] 부분이 처음에 계속 이해가 되지 않았다. visited 는 false로 초기화 되었는데, 왜 ‘방문하지 않았으면’ 의 조건이 !visited 가 되는지 이해가 안됐다. 결론적으로 알게된 건, ‘방문하지 않았으면, false’ 이기에 !으로 ‘true’ 를 만들어 주어 조건문이 실행되게 하기 위함이다.