https://www.acmicpc.net/problem/1260
📌 접근 방식
1️⃣ DFS(Depth First Search):
- 깊이 우선 탐색
➡️한 노드에서 가능한 멀리까지 탐색한 후, 다시 돌아와 다른 경로를 탐색하는 방법 - 스택 또는 재귀 호출을 활용해 구현 (이번엔 재귀 방식으로 구현!)
2️⃣ BFS(Breadth First Search):
- 너비 우선 탐색
➡️ 한 노드의 인접 노드들을 모두 탐색한 후, 그다음 깊이를 탐색 - 큐(Queue)를 사용해 구현
[알고리즘] 깊이 우선 탐색 : DFS(Depth-First-Search)
📌 깊이 우선 탐색이란?그래프 탐색 기법그래프 완전 탐색 기법 중 하나그래프의 시작 노드에서 출발하여 하나의 분기를 정해 최대 깊이까지 탐색이후, 탐색하지 않은 다른 분기로 이동해 탐
nyeroni.tistory.com
[알고리즘] 너비 우선 탐색 : BFS(Breadth-First-Search)
📌 너비 우선 탐색이란?그래프 탐색 기법그래프 완전 탐색 기법 중 하나그래프의 시작 노드에서 출발하여 시작 노드를 기준으로 가까운 노드를 먼저 방문하면서 탐색하는 알고리즘Queue(큐)
nyeroni.tistory.com
✅ PASS CODE
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static ArrayList<Integer>[] A;
static boolean[] visited;
static int N;
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());
int M = Integer.parseInt(st.nextToken());
int V = Integer.parseInt(st.nextToken());
A = new ArrayList[N+1];
for(int i=1; i<=N; i++) {
A[i] = new ArrayList<Integer>();
}
for(int i=0; i<M; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
A[s].add(e);
A[e].add(s);
}
for(int i=1; i<=N; i++) {
Collections.sort(A[i]);
}
visited = new boolean[N+1];
DFS(V);
System.out.println();
visited = new boolean[N+1];
BFS(V);
System.out.println();
}
public static void DFS(int start) {
System.out.print(start + " ");
visited[start] = true;
for(int i : A[start]) {
if(!visited[i]) {
visited[i] = true;
DFS(i);
}
}
}
public static void BFS(int start) {
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(start);
visited[start] = true;
while(!queue.isEmpty()) {
int cur = queue.poll();
System.out.print(cur + " ");
for(int i : A[cur]) {
if(!visited[i]) {
visited[i] = true;
queue.add(i);
}
}
}
}
}
💡 코드 분석
1️⃣ DFS 구현
DFS는 재귀 호출로 구현되며, 방문한 노드는 바로 출력
public static void DFS(int start) {
System.out.print(start + " ");
visited[start] = true; // 방문 처리
for (int i : A[start]) { // 인접 노드 순회
if (!visited[i]) {
visited[i] = true; // 방문 체크
DFS(i); // 재귀 호출
}
}
}
2️⃣ BFS 구현
BFS는 큐를 활용하여 방문 노드를 관리
public static void BFS(int start) {
Queue<Integer> queue = new LinkedList<>();
queue.add(start); // 시작 노드 삽입
visited[start] = true; // 방문 처리
while (!queue.isEmpty()) { // 큐가 빌 때까지
int cur = queue.poll(); // 큐에서 꺼내기
System.out.print(cur + " ");
for (int i : A[cur]) { // 인접 노드 순회
if (!visited[i]) {
visited[i] = true; // 방문 체크
queue.add(i); // 큐에 삽입
}
}
}
}
3️⃣ 입력 및 초기화
그래프 크기, 간선, 시작 정점 번호를 입력받고 초기화
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int V = Integer.parseInt(st.nextToken());
간선 정보를 읽어 그래프를 구성한 뒤, 방문 배열을 초기화함
visited = new boolean[N+1];
DFS(V);
System.out.println();
visited = new boolean[N+1];
BFS(V);
🧐 느낀점
이번 문제를 통해 DFS와 BFS의 개념과 특성을 더 명확히 이해할 수 있었다! 🔍
두 탐색 방법의 차이와 적용 방식을 완전히 이해하게 되었고, 이를 바탕으로 다양한 그래프 문제를 해결할 수 있을 것 같다. 앞으로 더 복잡한 그래프 문제를 해결할 때도 알고리즘 선택과 효율성에 신경 쓰면서 코드를 개선해 나가야겠다! 💪😊

'Coding Test > Baekjoon' 카테고리의 다른 글
[JAVA][Baekjoon] 1167번 트리의 지름 🌟🌟 (0) | 2025.01.06 |
---|---|
[JAVA][Baekjoon] 2178번 미로 탐색 🌟🌟 (0) | 2025.01.06 |
[JAVA][Baekjoon] 13023번 ABCDE 🌟🌟 (2) | 2025.01.05 |
[JAVA][Baekjoon] 2023번 신기한 소수 (0) | 2025.01.04 |
[JAVA][Baekjoon] 10989번 수 정렬하기 3 🌟 (0) | 2025.01.04 |