
๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1260
1260๋ฒ: DFS์ BFS
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N(1 โค N โค 1,000), ๊ฐ์ ์ ๊ฐ์ M(1 โค M โค 10,000), ํ์์ ์์ํ ์ ์ ์ ๋ฒํธ V๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๊ฐ์ ์ด ์ฐ๊ฒฐํ๋ ๋ ์ ์ ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ค ๋ ์ ์ ์ฌ
www.acmicpc.net
๋์ด๋

์๊ฐ์ ํ
2์ด
๋ฌธ์
๊ทธ๋ํ๋ฅผ DFS๋ก ํ์ํ ๊ฒฐ๊ณผ์ BFS๋ก ํ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋จ, ๋ฐฉ๋ฌธํ ์ ์๋ ์ ์ ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ์ ์ ๋ฒํธ๊ฐ ์์ ๊ฒ์ ๋จผ์ ๋ฐฉ๋ฌธํ๊ณ , ๋ ์ด์ ๋ฐฉ๋ฌธํ ์ ์๋ ์ ์ด ์๋ ๊ฒฝ์ฐ ์ข ๋ฃํ๋ค. ์ ์ ๋ฒํธ๋ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง์ด๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ ์ ์ ๊ฐ์ N(1 โค N โค 1,000), ๊ฐ์ ์ ๊ฐ์ M(1 โค M โค 10,000), ํ์์ ์์ํ ์ ์ ์ ๋ฒํธ V๊ฐ ์ฃผ์ด์ง๋ค. ๋ค์ M๊ฐ์ ์ค์๋ ๊ฐ์ ์ด ์ฐ๊ฒฐํ๋ ๋ ์ ์ ์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋ค ๋ ์ ์ ์ฌ์ด์ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ์ด ์์ ์ ์๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ๊ฐ์ ์ ์๋ฐฉํฅ์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ DFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ๋ฅผ, ๊ทธ๋ค์ ์ค์๋ BFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ค. V๋ถํฐ ๋ฐฉ๋ฌธ๋ ์ ์ ์์๋๋ก ์ถ๋ ฅํ๋ฉด ๋๋ค.
์ ์ถ๋ ฅ ์์ 1
์ ๋ ฅ
4 5 1
1 2
1 3
1 4
2 4
3 4
์ถ๋ ฅ
1 2 4 3
1 2 3 4
์ ์ถ๋ ฅ ์์ 2
์ ๋ ฅ
5 5 3
5 4
5 2
1 2
3 4
3 1
์ถ๋ ฅ
3 1 2 5 4
3 1 4 2 5
์ ์ถ๋ ฅ ์์ 3
์ ๋ ฅ
1000 1 1000
999 1000
์ถ๋ ฅ
1000 999
1000 999
๋ฌธ์ ํ์ด ๊ณผ์
๊ทธ๋ํ๋ฅผ ํํํ๋ ๋ฐฉ์์ ์ธ์ ํ๋ ฌ๊ณผ ์ธ์ ๋ฆฌ์คํธ 2๊ฐ์ง๊ฐ ์๋ค.
์์ธํ ์ค๋ช ์ ์๋ ๋ธ๋ก๊ทธ๋ฅผ ์ฐธ๊ณ ํ๊ธธ ๋ฐ๋๋ค.
[์๊ณ ๋ฆฌ์ฆ] Graph
๊ทธ๋ํ ๋ ธ๋(Node)์ ๊ฐ์ (Edge)์ผ๋ก ์ด๋ฃจ์ด์ง ์๋ฃ๊ตฌ์กฐ ์ด๋ ๋ ธ๋๋ฅผ ์ ์ (Vertex)๋ผ๊ณ ๋ ๋งํ๋ค. ์ข ๋ ์ฝ๊ฒ ์ค๋ช ํ๋ฉด ๋ ธ๋๋ ๋์, ๊ฐ์ ์ ๋๋ก์ด๋ค. A๋ผ๋ ๋์(๋ ธ๋)์์ B๋ผ๋ ๋์(๋ ธ๋)๋ก ์ด๋
hyeon-z.tistory.com
1. ์ธ์ ํ๋ ฌ์ ํตํ ๊ตฌํ
์ ๋ ฅ ๊ฐ ์ ์ฅํ๊ธฐ
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());
graph = new int[N + 1][N + 1];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int num1 = Integer.parseInt(st.nextToken());
int num2 = Integer.parseInt(st.nextToken());
graph[num1][num2] = 1;
graph[num2][num1] = 1;
}
์ธ์ ํ๋ ฌ์์ ์๋ก ์ธ์ ํ ๊ฒฝ์ฐ๋ 1๋ก ํ๊ธฐํ๊ณ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ์๋ 0์ผ๋ก ํ๊ธฐํ๋ค. ๋ฐ๋ผ์ ๊ฐ์ ์ด ์ฐ๊ฒฐํ๋ ๋ ์ ์ ์ ๋ฒํธ๋ฅผ ์ ๋ ฅ๋ฐ์ graph์ ์ ์ฅํ๋ค.
์ ์ถ๋ ฅ ์์ 1์ ๊ฒฝ์ฐ ์ด์ฒ๋ผ ์ธ์ ํ๋ ฌ์ด ํ๊ธฐ๋๋ค.

dfs ํจ์ ๊ตฌํ
public class BOJ_1260_1 {
static int N;
static int[][] graph;
static boolean[] visited;
static StringBuilder sb = new StringBuilder();
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());
graph = new int[N + 1][N + 1];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int num1 = Integer.parseInt(st.nextToken());
int num2 = Integer.parseInt(st.nextToken());
graph[num1][num2] = 1;
graph[num2][num1] = 1;
}
}
}
dfs๋ ๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. 1๋ถํฐ ์ ์ ์ ๊ฐ์๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉฐ graph์ ๊ฐ์ด 1์ด๊ณ (์ฐ๊ฒฐ๋ ์ ์ ์ด๊ณ ) ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ์ฐ์ ํด๋น ๋ ธ๋์ ๋ํ dfsํจ์๋ฅผ ํธ์ถํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค.
bfsํจ์ ๊ตฌํ
static void bfs(int n) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(n);
visited[n] = true;
while (!queue.isEmpty()) {
int node = queue.poll();
sb.append(node).append(" ");
for (int i = 1; i <= N; i++) {
if (graph[node][i] == 1 && !visited[i]) {
queue.offer(i);
visited[i] = true;
}
}
}
}
bfs๋ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ฒ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ๊ทธ ํ ํ์ ๋ ธ๋๊ฐ ์๋ ๋์ ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ด ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ํด๋น ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉฐ ๋ชจ๋ ํ์ํ๋ฉด ์ข ๋ฃ๋๋ค.
์ต์ข ์ฝ๋
public class BOJ_1260_1 {
static int N;
static int[][] graph;
static boolean[] visited;
static StringBuilder sb = new StringBuilder();
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());
graph = new int[N + 1][N + 1];
// ์ธ์ ํ๋ ฌ๋ก ๊ทธ๋ํ ๊ตฌํ
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int num1 = Integer.parseInt(st.nextToken());
int num2 = Integer.parseInt(st.nextToken());
graph[num1][num2] = 1;
graph[num2][num1] = 1;
}
visited = new boolean[N + 1];
dfs(V);
sb.append("\n");
visited = new boolean[N + 1];
bfs(V);
System.out.println(sb);
}
static void dfs(int n) {
visited[n] = true;
sb.append(n).append(" ");
for (int i = 1; i <= N; i++) {
if (graph[n][i] == 1 && !visited[i]) {
dfs(i);
}
}
}
static void bfs(int n) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(n);
visited[n] = true;
while (!queue.isEmpty()) {
int node = queue.poll();
sb.append(node).append(" ");
for (int i = 1; i <= N; i++) {
if (graph[node][i] == 1 && !visited[i]) {
queue.offer(i);
visited[i] = true;
}
}
}
}
}
dfs์ bfs๋ฅผ ์ํํ ๊ฒฐ๊ณผ๋ฅผ ํจ๊ป ์ถ๋ ฅํด์ผ ํ๋ฏ๋ก StringBuilder()๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๋ ฅํ๋ค.

2. ์ธ์ ๋ฆฌ์คํธ๋ฅผ ํตํ ๊ตฌํ
์ธ์ ํ๋ ฌ๊ณผ ๊ฐ์ ๋ถ๋ถ์ ๊ตฌํ์ ๋ํ ์ค๋ช ์ ์๋ตํ๊ฒ ๋ค.
์ ๋ ฅ ๊ฐ ์ ์ฅํ๊ธฐ
public class BOJ_1260_2 {
static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
static boolean[] visited;
static StringBuilder sb = new StringBuilder();
public static void main(String[] args) throws IOException {
...
for (int i = 0; i <= N; i++) {
graph.add(new ArrayList<>());
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int num1 = Integer.parseInt(st.nextToken());
int num2 = Integer.parseInt(st.nextToken());
graph.get(num1).add(num2);
graph.get(num2).add(num1);
}
}
}
๊ฐ ์ ์ ๋ง๋ค ์ฐ๊ฒฐ๋ ์ ์ ์ ๋ฒํธ๋ฅผ ์ ์ฅํด์ผ ํ๋ฏ๋ก ArrayList<ArrayList<Integer>>์ ํ์ ์ผ๋ก ๊ทธ๋ํ๊ฐ ๊ตฌ์ฑ๋๋ค.
๋ฐ๋ณต๋ฌธ์ ๋๋ฉฐ ์ฐ๊ฒฐ๋ ์ ์ ์ ๋ฒํธ๋ฅผ ์ ์ฅํ๋๋ฐ ์ฒ์ ์ ์ฅํ๋ ๊ฒฝ์ฐ์ graph.get()์ ์ํํ๊ธฐ ์ํด ๊ฐ ์ ์ ์ ArrayList์ ์ด๊ธฐํ๊ฐ ํ์ํ๋ค.
์ ์ถ๋ ฅ ์์ 1์ ๊ฒฝ์ฐ ์ด์ฒ๋ผ ์ธ์ ๋ฆฌ์คํธ๊ฐ ํ๊ธฐ๋๋ค.

โ์ฌ๊ธฐ์ ์ฃผ์ํ ์ !!
๋ฌธ์ ์ "๋ฐฉ๋ฌธํ ์ ์๋ ์ ์ ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ์๋ ์ ์ ๋ฒํธ๊ฐ ์์ ๊ฒ์ ๋จผ์ ๋ฐฉ๋ฌธํ๋ค."๋ผ๋ ์กฐ๊ฑด์ด ์๋ค.
์ธ์ ํ๋ ฌ์ ๊ฒฝ์ฐ ์ด๋ฅผ ๊ณ ๋ คํ์ง ์์๋ ๋์์ง๋ง ์ธ์ ๋ฆฌ์คํธ์์๋ ์ ์ฅํ ์์๋๋ก ํ์์ด ์งํ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
์์ 1์ ๊ฒฝ์ฐ ์์๋๋ก ์ ๋ ฅ ๊ฐ์ด ๋ค์ด์ ๋ฐ๋ก ์ ๋ ฌ์ด ํ์ ์์ง๋ง, ์์ 2๋ฅผ ์ดํด๋ณด๋ฉด ์ ์ ์ ํฌ๊ธฐ๊ฐ ์ ๋ ฌ์ด ๋์ง ์์ ์ฑ๋ก ์ ๋ ฅ ๊ฐ์ผ๋ก ์ฃผ์ด์ง ๊ฒ์ ๋ณผ ์ ์๋ค.
for (int i = 1; i <= N; i++) {
Collections.sort(graph.get(i));
}
์ด์ ๊ฐ์ด ๊ฐ ์ ์ ์ ์ธ์ ํ๋ ์ ์ ๋ฒํธ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค.
dfs ํจ์ ๊ตฌํ
static void dfs(int n) {
visited[n] = true;
sb.append(n).append(" ");
for (int i = 0; i < graph.get(n).size(); i++) {
int num = graph.get(n).get(i);
if (!visited[num]) {
dfs(num);
}
}
}
๊ฐ ์ ์ ์ ์ธ์ ํ๋ ์ ์ ๊ฐ์๋งํผ ๋ฐ๋ณต๋ฌธ์ ๋๋ฉฐ ํด๋น ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ์ง ์์์ ๊ฒฝ์ฐ dfsํจ์๋ฅผ ํธ์ถํ์ฌ ํ์์ ์งํํ๋ค.
bfsํจ์ ๊ตฌํ
static void bfs(int n) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(n);
visited[n] = true;
while (!queue.isEmpty()) {
int node = queue.poll();
sb.append(node).append(" ");
for (int i = 0; i < graph.get(node).size(); i++) {
int linkNode = graph.get(node).get(i);
if (!visited[linkNode]) {
queue.offer(linkNode);
visited[linkNode] = true;
}
}
}
}
์ค๋ช ์ ์ธ์ ํ๋ ฌ๊ณผ ๊ฐ๋ค.
์ต์ข ์ฝ๋
public class BOJ_1260_2 {
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));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int V = Integer.parseInt(st.nextToken());
// ๊ทธ๋ํ ์ด๊ธฐํ
for (int i = 0; i <= N; i++) {
graph.add(new ArrayList<>());
}
// ๊ทธ๋ํ์ ์
๋ ฅ ๊ฐ ์ ์ฅ
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int num1 = Integer.parseInt(st.nextToken());
int num2 = Integer.parseInt(st.nextToken());
graph.get(num1).add(num2);
graph.get(num2).add(num1);
}
// ์ ์ ๋ฒํธ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
for (int i = 1; i <= N; i++) {
Collections.sort(graph.get(i));
}
visited = new boolean[N + 1];
dfs(V);
sb.append("\n");
visited = new boolean[N + 1];
bfs(V);
System.out.println(sb);
}
static void dfs(int n) {
visited[n] = true;
sb.append(n).append(" ");
for (int i = 0; i < graph.get(n).size(); i++) {
int num = graph.get(n).get(i);
if (!visited[num]) {
dfs(num);
}
}
}
static void bfs(int n) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(n);
visited[n] = true;
while (!queue.isEmpty()) {
int node = queue.poll();
sb.append(node).append(" ");
for (int i = 0; i < graph.get(node).size(); i++) {
int linkNode = graph.get(node).get(i);
if (!visited[linkNode]) {
queue.offer(linkNode);
visited[linkNode] = true;
}
}
}
}
}

'๐ฏPS - Baekjoon, etc > BFS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ด๊ฒ์ด ์ฝ๋ฉ ํ ์คํธ๋ค] ๋ฏธ๋ก ํ์ถ (0) | 2023.03.28 |
---|---|
๐ฅ[๋ฐฑ์ค, 7576] ํ ๋งํ (Java) (1) | 2023.03.21 |
๋๊ธ