May 28, 2019
문제는 백준1260번을 풀면서 코드를 짜보았다. dfs, bfs는 막상 보면 아! 이랬었지 해도 잘 까먹는 알고리즘이라서 정리 해놔야겠다고 생각했다.
문제를 보고 구현한 전체 소스는 DFS와BFS 여기를 참고하면 된다.
static void dfs(int v) { //stack
Stack<Integer> stack = new Stack<Integer>();
// 1. 반드시 data structure에 넣고 visit 체크!
stack.push(v);
visited[v] = true;
System.out.print(" " + v);
boolean flag = false;
// 2. data structure 다 빌 때까지
while(!stack.isEmpty()) {
int vv = stack.peek();
flag = false;
// 3. 연결된 모든 노드에 대해서 찾으려고 반복
for(int i = 1; i <= n ;i++) {
if(graph[vv].contains(i) && !visited[i]) {
stack.push(i);
System.out.print(" " + i);
visited[i] = true;
flag = true;
break;
}
}
// 4. 갈 곳이 없으면 되돌아가서 다른 노드를 살펴야하니
if(!flag) {
stack.pop();
}
}
}
static void bfs(int v) { //queue
Queue<Integer> queue = new LinkedList<Integer>();
// 1. 반드시 data structure에 넣고 visit 체크!
queue.offer(v);
visited[v] = true;
// 2. data structure 다 빌 때까지
while(!queue.isEmpty()) {
// 3. 일단 Retrieves and removes head (돌아가지 않아도 됨)
v = queue.poll();
System.out.print( " "+v);
// 4. 연결된 모든 노드를 다 넣고 visit 체크
for(int i = 1 ; i <=n ; i++) {
if(graph[v].contains(i) && !visited[i]) {
queue.offer(i);
visited[i] = true;
}
}
}
}
dfs든 bfs든 모든 노드를 방문해보는 것에 의의가 있다고 생각한다. 일단
(while !strct.isEmpty)
(for i..n)
이렇게 기억하면 될 것 같다!