고코딩
[백준 1260번] DFS와 BFS 본문
문제
그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다.
입력
첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다.
출력
첫째 줄에 DFS를 수행한 결과를, 그 다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다.
정답
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
static class Graph{
//정점의 갯수
int v;
LinkedList<Integer>[] nodes; //정점을 연결할 연결리스트
//생성자
public Graph(int v) {
this.v = v+1;
nodes = new LinkedList[this.v];
for(int i=0;i<this.v;i++)
nodes[i] = new LinkedList();
}
//간선 생성
public void addEdge(int v, int w) {
nodes[v].add(w);
nodes[w].add(v);
}
//너비우선탐색BFS생성
//재귀함수 아님, 큐 이용해서 큐에 있는 애들 출력
public void BFS(int s) {
//방문한 애들 확인할 배열 생성
boolean [] visited = new boolean[this.v];
//큐생성
Queue<Integer> queue = new LinkedList<Integer>();
//지금 방문한 s방문한거 확인하고 큐에 삽입
visited[s] = true;
queue.add(s);
//큐가 빌떄까지 돌림
//큐에서 노드를 하나 빼냄
//빼낸 노드의 인접한 노드들중 방문하지 않는 노드들을 큐에 삽입
while(!queue.isEmpty()) {
int q = queue.poll();
System.out.print(q+" ");
//인접한 정점이 많을경우 수가 작은 것부터 확인해야해서 정렬
LinkedList<Integer> sortnodes = nodes[q];
Collections.sort(sortnodes);
Iterator<Integer> i = sortnodes.listIterator();
//인접한 노드들 검사
while(i.hasNext()) {
int n = i.next();
if(!visited[n]) {
queue.add(n);
visited[n] = true;
}
}
}
}
//깊이 우선 탐색DFS 끝까지 들어가서 확인
//s 노드부터 깊이 우선 탐색
//재귀함수 사용
public void DFS(int s) {
//방문한 노드 확인용 배열 처음에 다 false초기화
boolean [] visited = new boolean[this.v];
visited[s] = true;
System.out.print(s+" ");
DFSUtil(s, visited);
}
public void DFSUtil(int s, boolean[] visited) {
//먼저 현재 노드 방문한 것이니 true체크
visited[s] = true;
//현재 노드의 주변 노드들 가져오
LinkedList<Integer> sortnodes = nodes[s];
Collections.sort(sortnodes);
Iterator<Integer> i = sortnodes.listIterator();
//주변 노드중 방문 안한 노드 있으면 방문
//방문하기 전에 출력하고 방문
while(i.hasNext()) {
int n = i.next();
if(!visited[n]) {
System.out.print(n+" ");
DFSUtil(n,visited);
}
}
}
}
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringBuffer sf = new StringBuffer();
String[] NMV = br.readLine().split(" ");
Graph g = new Graph(Integer.parseInt(NMV[0]));
int m = Integer.parseInt(NMV[1]);
for(int i=0; i<m; i++) {
String [] nodes = br.readLine().split(" ");
g.addEdge(Integer.parseInt(nodes[0]), Integer.parseInt(nodes[1]));
}
int v = Integer.parseInt(NMV[2]);
g.DFS(v);
System.out.println();
g.BFS(v);
br.close();
bw.flush();
bw.close();
}
}
'코딩테스트' 카테고리의 다른 글
[백준 2667번] 단지번호붙이기 (0) | 2021.01.14 |
---|---|
[백준 2178번] 미로 탐색 (0) | 2021.01.14 |
[백준 2504번] 괄호의 값 (0) | 2021.01.12 |
[백준 4949번] 균형잡힌 세상 (0) | 2021.01.11 |
[백준 11279번] 최대 힙 (0) | 2021.01.11 |