728x90
문제
그래프를 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는 큐로 구현했다.
BFS는 어느 정도 감이 오는데 DFS는 아직도 너무 어렵다 ....
코드
312 ms, 25968 KB
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int[][] arr;
static int N;
static int M;
static int V;
static String result;
static String BFS() {
StringBuilder sb = new StringBuilder();
boolean[] visited = new boolean[N+1];
Queue<Integer> qu = new LinkedList<>();
qu.add(V);
visited[V] = true;
while(!qu.isEmpty()) {
int start = qu.poll();
sb.append(start).append(" ");
for(int i=1; i<=N; i++) {
if(!visited[i]&&arr[start][i]==1) {
qu.add(i);
visited[i] = true;
}
}
}
return sb.toString();
}
static void DFS(boolean[] visited, int start) {
visited[start] = true;
result += start + " ";
for(int i=1; i<=N; i++) {
if(arr[start][i]==1&&!visited[i]) {
DFS(visited, i);
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
V = Integer.parseInt(st.nextToken());
result = "";
arr = new int[N+1][N+1];
for(int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
arr[x][y] = 1;
arr[y][x] = 1;
}
boolean[] visited = new boolean[N+1];
DFS(visited, V);
String bfs = BFS();
System.out.println(result);
System.out.println(bfs);
}
}
728x90
반응형
'Problem Solving' 카테고리의 다른 글
[Java] 백준 11003. 최솟값 찾기 (0) | 2023.04.05 |
---|---|
[Java] 백준 10986. 나머지 합 (0) | 2023.04.05 |
[Java] 프로그래머스. 전화번호 목록 (0) | 2023.03.16 |
[Java] 프로그래머스. 완주하지 못한 선수 (0) | 2023.03.16 |
[Java] 프로그래머스. 햄버거 만들기 (0) | 2023.03.15 |