반응형
문제주소 :www.acmicpc.net/submit/1260
<문제 설명>
문제
그래프를 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
<풀이법>
▒ 한줄 개념: DFS & BFS ▒
DFS(깊이 우선 탐색) 과 BFS(너비 우선 탐색)의 개념에 대한 가장 기초적인 문제입니다.
DFS와 BFS의 개념에 대해 공부한다면 알고만 있다면 쉽게 풀 수 있는 문제인 것 같습니다.
자바로는 문제를 처음 풀어보다 보니 여러모로 코드가 좀 지저분하고 긴 면이 있는 것 같아서 추후 코드 수정이 필요할 것 같습니다.
<코드(Java)>
package Baekjoon;
import java.util.Scanner;
import java.util.Stack;
import java.util.LinkedList;
import java.util.Queue;
public class DFS_and_BFS_1260 {
public static int vertices_num;
public static int edges_num;
public static int[][] matrix;
public static boolean[] visited_dfs;
public static boolean[] visited_bfs;
public static int startVertex;
public static Stack<Integer> stack = new Stack<>();
public static Queue<Integer> queue = new LinkedList<>();
public static void main(String[] args){
System.out.println("Program Start.");
Scanner sc = new Scanner(System.in);
vertices_num = sc.nextInt()+1;
edges_num = sc.nextInt();
startVertex = sc.nextInt();
matrix = new int[vertices_num][vertices_num];
visited_dfs = new boolean[vertices_num];
visited_bfs = new boolean[vertices_num];
for(int i = 0; i< edges_num; i++){
int head = sc.nextInt();
int tail = sc.nextInt();
matrix[head][tail] = 1;
matrix[tail][head] = 1;
}
DFS(startVertex);
System.out.println();
BFS(startVertex);
}
public static void DFS(int startVertex){
stack.push(startVertex);
visited_dfs[startVertex] = true;
while(!stack.empty()){
int curVertex = stack.pop();
System.out.print(curVertex+" ");
for(int i = 0; i<vertices_num; i++){
if(matrix[curVertex][i] == 1 && !visited_dfs[i]){
DFS(i);
}
}
}
}
public static void BFS(int startVertex){
queue.offer(startVertex);
visited_bfs[startVertex] = true;
while(!queue.isEmpty()){
int curVertex = queue.poll();
System.out.print(curVertex+ " ");
for(int i = 0 ; i<vertices_num; i++){
if(matrix[curVertex][i] == 1 && !visited_bfs[i]){
queue.offer(i);
visited_bfs[i] = true;
}
}
}
}
}
더 많은 코드 보기(GitHub) : github.com/dwkim-97/CodingTest
반응형
'Baekjoon' 카테고리의 다른 글
[백준7578] 토마토 / Java (0) | 2020.12.29 |
---|---|
[백준2178] 미로 탐색 / Java (0) | 2020.12.29 |
[백준1012] 유기농 배추 / Java (0) | 2020.12.28 |
[백준2667] 단지 번호 붙이기 / Java (0) | 2020.12.28 |
[백준2606] 바이러스 / Java (0) | 2020.12.28 |