๋ฌธ์
ํด๋น ํฌ์คํ ์ ๋ฐฑ์ค์ 1260๋ฒ DFS์ BFS ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๊ธ ์ ๋๋ค.
์ ๋ต ์์ค ์ฝ๋๋ฅผ ํ์ธํ์๋ ค๋ฉด solve url ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋์ง๋ฅผ ๋จผ์ ์๊ฐํด๋ณด์.
ํด๊ฒฐ๋ฒ
ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ฐ์ ๊ทธ๋ํ๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
๊ทธ๋ํ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์๋ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์๋ค.
์ด 2๊ฐ์ง (์ธ์ ํ๋ ฌ, ์ธ์ ๋ฆฌ์คํธ)๋ก ์ฐ์ ๊ทธ๋ํ๋ฅผ ๊ตฌํ ํ ๋ค ํ์์ ์ํํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๋ง์ฝ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ํด์ ์์ง ๋ชปํ๋ค๋ฉด ์๋ ๋งํฌ๋ฅผ ํตํด์ ํ ๋ฒ ํ์ธํ๋ ๊ฒ๋ ์ข์ ์ ํ์ด๋ค.
๊ทธ๋ํ์ DFS์ BFS๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์๋ค.
- ์คํ์ผ๋ก DFS ๊ตฌํํ๊ธฐ
- ์ฌ๊ท ํธ์ถ๋ก DFS ๊ตฌํํ๊ธฐ
- ํ๋ก BFS ๊ตฌํํ๊ธฐ
์์ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ชจ๋ ๊ฒฝํํด๋ณด๋ฉฐ ์คํ์๊ฐ์ ๋น๊ตํด๋ณด์.
์ ๊ทผ๋ฒ
์ฐ์ ์ฐ๋ฆฌ๋ ์ธ์ ๋ฆฌ์คํธ์ ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ์
๋ ฅ ๋ฐ์ ๊ธธ์ด + 1๋ก ์ธ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ 2๊ฐ์ง ์ต์
์ด ์กด์ฌํ๋ค.
- ์ธ์ ๋ฆฌ์คํธ์ ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ์ ๋ ฅ ๋ฐ์ ๊ธธ์ด ๊ทธ๋๋ก ์ธ ๊ฒ์ธ๊ฐ.
- ์ธ์ ๋ฆฌ์คํธ์ ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ์ ๋ ฅ ๋ฐ์ ๊ธธ์ด + 1๋ก ์ธ ๊ฒ์ธ๊ฐ.
1๋ฒ์ ๊ฒฝ์ฐ ์ถ๋ ฅ๊ณผ ๊ทธ๋ํ ์์ ์ + 1๊ณผ -1์ ํด์ค์ผ ํ๋ค.
ํ์ง๋ง 2๋ฒ์ ๊ฒฝ์ฐ 1๋ฒ์ ๋นํด ๋ฉ๋ชจ๋ฆฌ๋ ๋ ์ฐ๊ฒ ์ง๋ง ๊ทธ๋๋ ์ฐ๋ฆฌ๊ฐ ์ฝ๋ฉํ๊ธฐ ํธํ๋ค.
์ด์ ์ค์ง์ ์ผ๋ก DFS์ BFS๋ฅผ ๊ตฌํํด๋ณด์.
์คํ์ผ๋ก DFS ๊ตฌํํ๊ธฐ
private static void dfsByStack(int x) {
Stack<Integer> stack = new Stack<>();
boolean flag;
visited[x] = true;
sb.append(x).append(" ");
stack.push(x);
while(!stack.isEmpty()) {
x = stack.peek();
int size = graph.get(x).size();
flag = false;
for (int i = 0; i < size; i++) {
int value = graph.get(x).get(i);
if (!visited[value]) {
stack.push(value);
sb.append(value).append(" ");
visited[value] = true;
flag = true;
break;
}
}
if(!flag) {
stack.pop();
}
}
}
์ฌ๊ทํธ์ถ๋ก DFS ๊ตฌํํ๊ธฐ
private static void dfsByRecursive(int x) {
if(visited[x]) return; // ๋ฐฉ๋ฌธํ ์ ์ด ์๋ ๋
ธ๋๋ฉด ๋ฐ๋ก ๋๊ฐ
visited[x] = true;
sb.append(x).append(" ");
for(int value : graph.get(x)) {
if(!visited[value]) dfsByRecursive(value);
}
}
ํ๋ก BFS ๊ตฌํํ๊ธฐ
private static void bfs(int start) {
Queue<Integer> queue = new LinkedList<>();
visited[start] = true;
queue.add(start);
while(!queue.isEmpty()) {
int x = queue.remove();
sb.append(x).append(" ");
for (int i = 0; i < graph.get(x).size(); i++) {
int value = graph.get(x).get(i);
if(!visited[value]) {
visited[value] = true;
queue.add(value);
}
}
}
}
์ค๋ต ํ๋ณด
๋ฌธ์ ์์ ์ ์ ๋ฒํธ๊ฐ ์์ ๊ฒ์ ๋จผ์ ๋ฐฉ๋ฌธํ๋ผ๊ณ ํ๋ค.
์ ์ ๋ฒํธ๊ฐ ์์ ๊ฒ ๋ถํฐ ๋ฐฉ๋ฌธ ํ๋ ค๋ฉด ์ฐ๋ฆฌ์ ์ธ์ ๋ฆฌ์คํธ์ ์กด์ฌํ๋ ๊ฐ๊ฐ์ ๋ฆฌ์คํธ๋ค์ด ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ๋์ด ์์ด์ผ ํ๋ค.
๊ทธ๋์ ๊ทธ๋ํ ๊ตฌํ์ด ๋๋๊ณ ์ค์ง์ ์ธ ํ์์ ๋ค์ด๊ฐ๊ธฐ ์ ์ ์ ๋ ฌ์ ํด์ฃผ๋๋ก ํ๋ฉด ๋๋ค.
์ ๋ต ์ฝ๋
public class Main {
static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
static boolean[] visited;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] nmv = br.readLine().split(" ");
int n = Integer.parseInt(nmv[0]);
int m = Integer.parseInt(nmv[1]);
int v = Integer.parseInt(nmv[2]);
// ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์ด ์์ฑ
// ์ธ์ ๋ฆฌ์คํธ ์ด๊ธฐํ
for (int i = 0; i <= n; i++) {
graph.add(new ArrayList<>());
}
// ์
๋ ฅ ์ฒ๋ฆฌ (๊ทธ๋ํ ์ฐ๊ฒฐ)
for(int i = 0; i < m; i++) {
String[] n1n2 = br.readLine().split(" ");
int n1 = Integer.parseInt(n1n2[0]);
int n2 = Integer.parseInt(n1n2[1]);
graph.get(n1).add(n2);
graph.get(n2).add(n1);
}
for (int i = 0; i <= n; i++) {
Collections.sort(graph.get(i));
}
visited = new boolean[n + 1];
dfsByRecursive(v);
bw.flush();
sb.append("\n");
visited = new boolean[n + 1];
bfs(v);
System.out.println(sb.toString());
bw.flush();
bw.close();
}
private static void dfsByStack(int x) {
Stack<Integer> stack = new Stack<>();
boolean flag;
visited[x] = true;
sb.append(x).append(" ");
stack.push(x);
while(!stack.isEmpty()) {
x = stack.peek();
int size = graph.get(x).size();
flag = false;
for (int i = 0; i < size; i++) {
int value = graph.get(x).get(i);
if (!visited[value]) {
stack.push(value);
sb.append(value).append(" ");
visited[value] = true;
flag = true;
break;
}
}
if(!flag) {
stack.pop();
}
}
}
private static void dfsByRecursive(int x) {
visited[x] = true;
sb.append(x).append(" ");
int size = graph.get(x).size();
for (int i = 0; i < size; i++) {
int value = graph.get(x).get(i);
if(!visited[value]) {
dfsByRecursive(value);
}
}
}
private static void bfs(int start) {
Queue<Integer> queue = new LinkedList<>();
visited[start] = true;
queue.add(start);
while(!queue.isEmpty()) {
int x = queue.remove();
sb.append(x).append(" ");
for (int i = 0; i < graph.get(x).size(); i++) {
int value = graph.get(x).get(i);
if(!visited[value]) {
visited[value] = true;
queue.add(value);
}
}
}
}
}
๋ฌธ์ ํ๊ณ
์ด๋ฒ ๋ฌธ์ ์์๋ ์ถ๋ ฅ์์ ์ ๋ฅผ ๋ง์ด ๋จน์๋ค.
๋ฉ์๋์์ sb๋ก append๋ฅผ ํด์ฃผ๋ ๋ก์ง์์ ๋๋ ํ ๋ฒ์ ํ์์ด ๋๋ ๋ bw๋ก ์ถ๋ ฅํ๋ ค ํ๋ค.
๊ทธ๋์ ๋ง์ฝ ๋ต์ด 4๊ฐ๋ผ๋ฉด 8๊ฐ๊ฐ ์ถ๋ ฅ๋๊ณค ํ๋ค.
๋ฌธ์ ์ ๋ก์ง์ ์ง๋ ๊ฒ๋ ์ค์ํ๋ ์ถ๋ ฅ ๊ด๋ฆฌ๋ ์ค์ํ๋จ ๊ฒ์ ๋ ์๊ฒ ๋์๋ค.
๋๊ธ