๋ฌธ์
[๋ฐฑ์ค 1260๋ฒ]
๊ทธ๋ํ๋ฅผ DFS๋ก ํ์ํ ๊ฒฐ๊ณผ์ BFS๋ก ํ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋จ, ๋ฐฉ๋ฌธํ ์ ์๋ ์ ์ ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ์ ์ ๋ฒํธ๊ฐ ์์ ๊ฒ์ ๋จผ์ ๋ฐฉ๋ฌธํ๊ณ , ๋ ์ด์ ๋ฐฉ๋ฌธํ ์ ์๋ ์ ์ด ์๋ ๊ฒฝ์ฐ ์ข ๋ฃํ๋ค. ์ ์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N(1 ≤ N ≤ 1,000), ๊ฐ์ ์ ๊ฐ์ M(1 ≤ M ≤ 10,000), ํ์์ ์์ํ ์ ์ ์ ๋ฒํธ V๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๊ฐ์ ์ด ์ฐ๊ฒฐํ๋ ๋ ์ ์ ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ค ๋ ์ ์ ์ฌ์ด์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ด ์์ ์ ์๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๊ฐ์ ์ ์๋ฐฉํฅ์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ DFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ๋ฅผ, ๊ทธ ๋ค์ ์ค์๋ BFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค. V๋ถํฐ ๋ฐฉ๋ฌธ๋ ์ ์ ์์๋๋ก ์ถ๋ ฅํ๋ฉด ๋๋ค.
์์
ํ์ด
์ด ๋ฌธ์ ๋ DFS(๊น์ด ์ฐ์ ํ์)๊ณผ BFS(๋๋น ์ฐ์ ํ์)์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฑ์ค ๋ฌธ์ ์ด๋ค.
DFS๋ ์ํ์ด ์๋์ง ๊ฒ์ฌํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๊ณ , BFS๋ ์ต๋จ๊ฒฝ๋ก๋ฅผ ํ์ํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
0. ์ฑ๊ณต ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
//DFS์ BFS
public class Main {
public static int[][] edges; //๊ฐ์ ๊ธฐ๋ก์ ์ํ ์ธ์ ํ๋ ฌ
public static Set<Integer> visited = new HashSet<>(); //๋ฐฉ๋ฌธํ ๋ฆฌ์คํธ
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
//N = ์ ์ ์ ๊ฐ์
int n = Integer.parseInt(st.nextToken());
//M = ๊ฐ์ ์ ๊ฐ์
int m = Integer.parseInt(st.nextToken());
//V = ํ์์ ์์ํ ์ ์ ์ ๋ฒํธ
int v = Integer.parseInt(st.nextToken());
edges = new int[n+1][n+1];
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
edges[a][b] = edges[b][a] = 1; // (a,b) ์ (b,a) ๋ชจ๋ ๊ธฐ๋ก
}
dfs(v);
visited.clear();
System.out.println();
bfs(v);
}
public static void bfs(int source) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(source); // Queue์ ํ์ฌ ๋
ธ๋ ๋ฃ๊ธฐ
visited.add(source); // ๋ฐฉ๋ฌธ ๊ธฐ๋ก
while (!queue.isEmpty()) { // Queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
int current = queue.poll(); // Queue์์ ํ์ฌ ๊ฐ ๊บผ๋ด๊ธฐ
System.out.printf(current + " ");
//์ธ์ ํ ๋
ธ๋๋ค ๋ชจ๋ ๋ฐฉ๋ฌธ
for (int i = 0; i<edges[current].length; i++) {
if (edges[current][i] == 1 && !visited.contains(i)) { // ์ธ์ ๋
ธ๋ ์ค, ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋์ ๋ํด
queue.offer(i); // ํด๋น ๋
ธ๋ Queue์ ๋ฃ๊ธฐ
visited.add(i); //๋ฐฉ๋ฌธ ๊ธฐ๋ก
}
}
}
}
public static void dfs(int source) {
System.out.printf(source + " ");
visited.add(source); // ๋
ธ๋ ๋ฐฉ๋ฌธ ๊ธฐ๋ก
for (int i = 0; i < edges[source].length; i++) {
if (edges[source][i] == 1 && !visited.contains(i)) { // ๋ง์ฝ ํด๋น ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ค๋ฉด
dfs(i); // ํด๋น ๋
ธ๋ ๋ฐฉ๋ฌธ
}
}
}
}
1. ๋ฌธ์ ํ์ด
input
public static int[][] edges; //๊ฐ์ ๊ธฐ๋ก์ ์ํ ์ธ์ ํ๋ ฌ
public static Set<Integer> visited = new HashSet<>(); //๋ฐฉ๋ฌธํ ๋ฆฌ์คํธ
edges = new int[n+1][n+1];
for (int i = 0; i < m; i++) {
st = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
edges[a][b] = edges[b][a] = 1; // (a,b) ์ (b,a) ๋ชจ๋ ๊ธฐ๋ก
}
๋๋ ๊ฐ์ ๊ธฐ๋ก์ ์ํด ์ธ์ ํ๋ ฌ ๋ฐฉ์์ ์ ํํ๋ค.
๊ฐ index์ ๋ฐ๋ผ 1์ ํ์ํจ์ผ๋ก์จ ์ธ์ ํ๋ค๋ ๊ฒ์ ๋ํ๋ธ๋ค.
๋ง์ฝ ์์ ๋ก
4 5 1
1 2
1 3
1 4
2 4
3 4
๊ฐ ๋ค์ด์๋ค๋ฉด, edges ๋ ์๋์ ๊ฐ์ด ๋ ๊ฒ์ด๋ค.
๊ฐ index 0์ ๋ฐ์ดํฐ๊ฐ ์๋ฏธ๊ฐ ์๊ณ , 1~4 ์ฌ์ด ์ธ์ ํ ๋ ธ๋๋ผ๋ฉด 1์ ๊ธฐ๋กํ๋ค.
๊ฐ์ ์ ๋ฐฉํฅ์ฑ์ด ์๋ค๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ๊ฐ ๋ ธ๋ ๋ชจ๋ ๊ธฐ๋กํ๊ธฐ ๋๋ฌธ์ edges[a][b]์ edges[b][a] ๋ชจ๋ 1์ ๊ธฐ๋กํด์ฃผ๋๊ฒ ์ค์ํ๋ค.
๋ฐฉ๋ฌธํ ๊ธฐ๋ก์ ์ค๋ณต์ด ์๊ด์๋ ์๋ฃ๊ตฌ์กฐ์ธ Set์ ์ด์ฉํด ์ฃผ์๋ค.
DFS
public static void dfs(int source) {
System.out.printf(source + " ");
visited.add(source); // ๋
ธ๋ ๋ฐฉ๋ฌธ ๊ธฐ๋ก
for (int i = 0; i < edges[source].length; i++) {
if (edges[source][i] == 1 && !visited.contains(i)) { // ๋ง์ฝ ํด๋น ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ค๋ฉด
dfs(i); // ํด๋น ๋
ธ๋ ๋ฐฉ๋ฌธ
}
}
}
DFS๋ ์ฌ๊ทํจ์๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
๋จ์ํ๊ฒ ์ธ์ ํ ๋ ธ๋๊ฐ ๋ฐฉ๋ฌธํ์ง ์์์ ๊ฒฝ์ฐ, ํด๋น ๋ ธ๋์ ๋ํด ์ฌ๊ท ํธ์ถ์ ํด์ฃผ๋ฉด ๋๋ค.
BFS
public static void bfs(int source) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(source); // Queue์ ํ์ฌ ๋
ธ๋ ๋ฃ๊ธฐ
visited.add(source); // ๋ฐฉ๋ฌธ ๊ธฐ๋ก
while (!queue.isEmpty()) { // Queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต
int current = queue.poll(); // Queue์์ ํ์ฌ ๊ฐ ๊บผ๋ด๊ธฐ
System.out.printf(current + " ");
//์ธ์ ํ ๋
ธ๋๋ค ๋ชจ๋ ๋ฐฉ๋ฌธ
for (int i = 0; i<edges[current].length; i++) {
if (edges[current][i] == 1 && !visited.contains(i)) { // ์ธ์ ๋
ธ๋ ์ค, ๋ฐฉ๋ฌธํ์ง ์์ ๋
ธ๋์ ๋ํด
queue.offer(i); // ํด๋น ๋
ธ๋ Queue์ ๋ฃ๊ธฐ
visited.add(i); //๋ฐฉ๋ฌธ ๊ธฐ๋ก
}
}
}
}
BFS๋ Queue์๊ฐ์ FIFO ์๋ฃ๊ตฌ์กฐ๋ฅผ ํตํด ๊ตฌํ ๊ฐ๋ฅํ๋ค.
์ธ์ ํ ๋ ธ๋๋ค ์ค ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ค์ ๋ชจ๋ Queue์ ๋ฃ์ด๋๊ณ ,
๋ค์ while๋ฌธ์ด ๋์์์ ๋ Queue๊ฐ ๋น์ด์์ง ์๋ค๋ฉด Queue์ ์๋ ๋ ธ๋๋ค์ ๋ค์ ์์ฐจ์ ์ผ๋ก ์งํํ๋ค.
ํด๋น while๋ฌธ์ด ๋ฐ๋ณต๋ ํ์๊ฐ ๊ณง ๊น์ด(depth)๊ฐ ๋๊ฒ ๋ค.
'Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ๋ฐฑ์ค 18111 ๋ง์ธํฌ๋ํํธ ๋ ํจ์จ์ ์ผ๋ก ํ๊ธฐ (0) | 2024.03.03 |
---|---|
[Java] ์ด๋ถํ์ (0) | 2024.03.01 |
[Java] BFS์ ํ์ฉ - ์ต๋จ๊ฑฐ๋ฆฌ (0) | 2024.02.29 |