[Algorithm /백준] DFS와 BFS

2023. 11. 3. 01:00Algorithm/JAVA

[문제]
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.

[입력]
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.

[출력]
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.

 

 

 

[예제 입력1]

4 5 1
1 2
1 3
1 4
2 4
3 4

 

[예제 출력1]

1 2 4 3
1 2 3 4

 

[예제 입력2]

5 5 3
5 4
5 2
1 2
3 4
3 1

 

[예제 출력2]

3 1 2 5 4
3 1 4 2 5

 

 

[예제 입력3]

1000 1 1000
999 1000

 

[예제 출력3]

1000 999
1000 999

 

 

 

 

[문제 해결]

import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
import java.util.Stack;

public class DfsAndBfs {

	static boolean [] visitS;
	static boolean [] visitQ;
	static Queue<Integer> Q = new LinkedList<>();
	static Stack<Integer> stack = new Stack<>();
	static Set<Integer> qSet = new LinkedHashSet<Integer>();
	public static void main(String[] args) {
		DfsAndBfs ma = new DfsAndBfs();
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int M = sc.nextInt();
		int V =  sc.nextInt();
		
		int [][]graph =new int[N+1][N+1];
		visitS = new boolean[N+1];
		visitQ = new boolean[N+1];
		for(int i= 1 ; i <=M ; i++) {
			int num1 = sc.nextInt();
			int num2 = sc.nextInt();
			graph[num1][num2]= 1;
			graph[num2][num1]= 1;
		}
	   stack.add(V);
	   visitS[V]=true;
	   ma.DFS(graph,1,V, M);
	
	   for(int i = 0 ; i < stack.size(); i++) {
		  System.out.print(stack.get(i)+" ");
	   }
	   System.out.println();
	  
	   ma.BFS(graph,V,1);
	   int [] qArr = qSet.stream().mapToInt(Integer::intValue).toArray();
	 
	   for(int i = 0; i <qArr.length; i ++) {
		  System.out.print(qArr[i] + " ");
	   }
	
	}
	public void DFS(int[][] graph, int count, int startV, int M) {
		if(count == M+1) {
			return;
		}
		for(int i = 1; i <graph.length; i++) {
			if(graph[startV][i] == 1) {
				if(!visitS[i]) {
					visitS[i] = true;
					stack.add(i);
					DFS(graph,count+1,i,M);
				}
			}
		}
	}
	public void BFS(int [][]graph, int startV, int count) {
		Q.add(startV);
		visitQ[startV]=true;
		
		while(Q.size()!= 0) {
			for(int i = 1; i <graph.length; i++) {
				if(graph[startV][i] == 1) {
					if(!visitQ[i]) {
						visitQ[i]= true;
						Q.add(i);
					}
				}
				if(i == graph.length -1) {
					qSet.add(Q.poll());
					startV= (Q.size() != 0)?Q.peek():0;
				}
			  }
		}
	}
}

 

 

 

+) 이해가 될거 같다가도 안되서 정말로 한참이 걸렸던 문제....

갑자기 그림을 옆에 띄우고 코딩을 하니 풀렸다.

 

다만 처음에는 출력값은 맞다가도, DFS의 논리구조가 틀렸다는 생각이 들었지만 그냥 넘어가려다가

시간 초과 걸린김에 다시 뒤집었다ㅎㅎ

 

진짜 기본문제인데 이문제는 진짜 복습 열심히 해야겠다.