
문제
- 그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램 작성
- 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문
- 더 이상 방문할 수 있는 점이 없는 경우 종료
- 정점 번호는 1번부터 N번까지
어려웠던 점
- BFS, DFS를 구현하는데 왜 인접행렬을 구현해야하는가 ?
- 인접행렬 vs 인접리스트 차이
- DFS, BFS 구현 방법 미숙지
✅ 왜 인접 행렬을 사용했을까?
✅ 인접 리스트를 쓰면 좋은 경우
import java.io.*;
import java.util.*;
public class BOJ_1260 {
static int N; // N : 정점의 개수
static int M; // M : 간선의 개수
static int V; // V : 탐색을 시작할 정점의 번호
static int[][] map;
static int[] visited;
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());
map = new int[N + 1][N + 1];
for(int i = 0; i < M; i++){
st = new StringTokenizer(br.readLine());
int v1 = Integer.parseInt(st.nextToken());
int v2 = Integer.parseInt(st.nextToken());
map[v1][v2] = 1;
map[v2][v1] = 1;
}
visited = new int[N + 1];
dfs(V);
System.out.println();
visited = new int[N + 1];
bfs(V);
}
public static void dfs(int v) {
visited[v] = 1;
System.out.print(v + " ");
for(int i = 1; i <= N; i++){
if(map[v][i] == 1 && visited[i] == 0){
dfs(i);
}
}
}
public static void bfs(int v) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(v);
visited[v] = 1;
while(!queue.isEmpty()){
int current = queue.poll();
System.out.print(current + " ");
visited[current] = 1;
for(int i = 1; i <= N; i++){
if(map[i][current] == 1 && visited[i] == 0){
queue.offer(i);
visited[i] = 1;
}
}
}
}
}
느낀점
- BFS, DFS 꾸준히 연습해야함 !!
- 인접리스트로도 구현해보자 !!