|
1 | | -/* /dev/stdin */ |
2 | | -let fs = require('fs'); |
3 | | -let input = fs.readFileSync('/dev/stdin').toString().split('\n'); |
| 1 | +// /dev/stdin |
| 2 | +const fs = require("fs"); |
| 3 | +let input = fs |
| 4 | + .readFileSync("/dev/stdin") |
| 5 | + .toString() |
| 6 | + .split("\n") |
| 7 | + .map((x) => x.replace("\r", "")); |
4 | 8 |
|
5 | | -// 노드, 간선, 시작 |
6 | | -const [N, M, V] = input[0].split(' ').map(Number); |
7 | | - |
8 | | -let graph = []; |
| 9 | +const [N, M, V] = input[0].split(" ").map(Number); |
9 | 10 |
|
10 | | -for(let i = 0; i <= N; i++) { |
11 | | - graph.push([]); |
12 | | -} |
13 | | -for(let i = 1; i <= M; i++) { |
14 | | - const [x, y] = input[i].split(' ').map(Number) |
15 | | - graph[x].push(y) |
16 | | - graph[x].sort((a, b) => a - b); |
17 | | - graph[y].push(x) |
18 | | - graph[y].sort((a, b) => a - b); |
19 | | -} |
20 | | - |
21 | | -// console.log(graph) |
| 11 | +const graph = Array.from({ length: N + 1 }, () => []); |
22 | 12 |
|
23 | | -let visited = Array(N+1).fill(false); |
24 | | -let dfsLine = ''; |
25 | | -let bfsLine = ''; |
| 13 | +const dfsResult = []; |
| 14 | +const bfsResult = []; |
26 | 15 |
|
| 16 | +for (let i = 1; i <= M; i++) { |
| 17 | + const [x, y] = input[i].split(" ").map(Number); |
| 18 | + graph[x].push(y); |
| 19 | + graph[y].push(x); |
| 20 | +} |
27 | 21 |
|
28 | | -dfs(graph, V, visited); |
29 | | - |
30 | | -visited = Array(N+1).fill(false); |
31 | | -bfs(graph, V, visited); |
32 | | -console.log(dfsLine) |
33 | | -console.log(bfsLine) |
| 22 | +// 🔑 방문 순서 조건 |
| 23 | +for (let i = 1; i <= N; i++) { |
| 24 | + graph[i].sort((a, b) => a - b); |
| 25 | +} |
34 | 26 |
|
| 27 | +let visited = Array.from({ length: N + 1 }, () => false); |
35 | 28 |
|
| 29 | +dfs(graph, V, visited); |
36 | 30 |
|
37 | 31 | function dfs(graph, v, visited) { |
| 32 | + // 현재 노드를 방문 처리 |
38 | 33 | visited[v] = true; |
39 | | - dfsLine += v + ' ' |
40 | | - |
41 | | - for(i of graph[v]) { |
42 | | - if(!visited[i]) { |
43 | | - dfs(graph, i, visited); |
| 34 | + dfsResult.push(v); |
| 35 | + // 현재 노드와 연결된 다른 노드를 재귀적으로 방문 |
| 36 | + for (const next of graph[v]) { |
| 37 | + if (!visited[next]) { |
| 38 | + dfs(graph, next, visited); |
44 | 39 | } |
45 | 40 | } |
46 | 41 | } |
| 42 | +////////////// |
| 43 | +visited = Array.from({ length: N + 1 }, () => false); |
47 | 44 |
|
48 | | -function bfs(graph, start, visited) { |
49 | | - let queue = []; |
50 | | - queue.push(start); |
| 45 | +bfs(graph, V, visited); |
51 | 46 |
|
52 | | - visited[start] = true; |
| 47 | +function bfs(graph, v, visited) { |
| 48 | + const queue = []; |
| 49 | + queue.push(v); |
| 50 | + visited[v] = true; |
53 | 51 |
|
54 | | - while(queue.length != 0) { |
55 | | - let v = queue.shift(); |
56 | | - bfsLine += (v + ' '); |
57 | | - for(i of graph[v]) { |
58 | | - if(!visited[i]) { |
59 | | - queue.push(i); |
60 | | - visited[i] = true; |
| 52 | + while (queue.length > 0) { |
| 53 | + const q = queue.shift(); // 큐의 맨 앞 |
| 54 | + bfsResult.push(q); |
| 55 | + for (const next of graph[q]) { |
| 56 | + if (!visited[next]) { |
| 57 | + visited[next] = true; |
| 58 | + queue.push(next); |
61 | 59 | } |
62 | 60 | } |
63 | 61 | } |
64 | | - |
65 | 62 | } |
66 | 63 |
|
| 64 | +console.log(dfsResult.join(" ")); |
| 65 | +console.log(bfsResult.join(" ")); |
0 commit comments