https://www.acmicpc.net/problem/24444
๐ ์๋ฐ(Java)๋ก ํธ๋ ๋๋น ์ฐ์ ํ์(BFS) - ๋ฐฑ์ค 24444 ๋ฌธ์ ํ์ด ๐
๐ ๋ฌธ์ ๊ฐ์
์ด ๋ฌธ์ ๋ ๋ฐฑ์ค 24444๋ฒ - ์๊ณ ๋ฆฌ์ฆ ์์
- ๋๋น ์ฐ์ ํ์ 1 ๋ฌธ์ ์
๋๋ค.
์ฃผ์ด์ง ๊ทธ๋ํ๋ฅผ ๋๋น ์ฐ์ ํ์(BFS) ํ๋ฉด์ ๋ฐฉ๋ฌธ ์์๋ฅผ ๊ธฐ๋กํด์ผ ํฉ๋๋ค.
๊ฐ ์ ์ ์ ์ค๋ฆ์ฐจ์์ผ๋ก ๋ฐฉ๋ฌธํด์ผ ํ๋ฉฐ, ๋ฐฉ๋ฌธ ์์๋ result[] ๋ฐฐ์ด์ ์ ์ฅํด์ผ ํฉ๋๋ค.
๐ก ์์ ์ ๋ ฅ
5 5 1
1 4
1 2
2 3
2 4
3 4
๐ก ์์ ์ถ๋ ฅ
1
2
3
4
5
โก 1๋ฒ ์ ์ ๋ถํฐ BFS ํ์ํ๋ฉฐ ๋ฐฉ๋ฌธ ์์๋ฅผ ์ถ๋ ฅํด์ผ ํฉ๋๋ค.
๐ ์๊ณ ๋ฆฌ์ฆ ์ ๊ทผ ๋ฐฉ์
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด BFS(๋๋น ์ฐ์ ํ์) + ์ ๋ ฌ์ ํ์ฉํฉ๋๋ค.
โ๏ธ ์ฃผ์ ๊ณ ๋ ค ์ฌํญ
โ BFS๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ํ๋ฅผ ํ์
โ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
โ ์ ์ ๋ฐฉ๋ฌธ ์์๋ฅผ result[] ๋ฐฐ์ด์ ๊ธฐ๋ก
โ ํ(Queue)๋ฅผ ์ฌ์ฉํ์ฌ BFS๋ฅผ ๊ตฌํ
๐น Java ์ฝ๋ ํด์ค
import java.util.*;
import java.io.*;
public class Main {
static int N, M, R; // ์ ์ ์, ๊ฐ์ ์, ์์ ์ ์
static ArrayList<Integer>[] list; // ์ธ์ ๋ฆฌ์คํธ
static boolean[] isVisited; // ๋ฐฉ๋ฌธ ์ฌ๋ถ ์ ์ฅ ๋ฐฐ์ด
static Queue<Integer> q = new ArrayDeque<>(); // BFS๋ฅผ ์ํ ํ
static int[] result; // ๋ฐฉ๋ฌธ ์์ ์ ์ฅ ๋ฐฐ์ด
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = stoInt(st.nextToken()); // ์ ์ ๊ฐ์
M = stoInt(st.nextToken()); // ๊ฐ์ ๊ฐ์
R = stoInt(st.nextToken()); // ์์ ์ ์
isVisited = new boolean[N + 1]; // ๋ฐฉ๋ฌธ ์ฌ๋ถ ๋ฐฐ์ด
result = new int[N + 1]; // ๋ฐฉ๋ฌธ ์์ ๋ฐฐ์ด
list = new ArrayList[N + 1];
inputAndSort(br); // ์
๋ ฅ ๋ฐ ์ ๋ ฌ
BFS(R); // BFS ์คํ
printResult(); // ๊ฒฐ๊ณผ ์ถ๋ ฅ
}
// ์
๋ ฅ ๋ฐ ์ ๋ ฌ ์ฒ๋ฆฌ
private static void inputAndSort(BufferedReader br) throws IOException {
StringTokenizer st;
for (int i = 0; i <= N; i++) {
list[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = stoInt(st.nextToken());
int b = stoInt(st.nextToken());
list[a].add(b);
list[b].add(a);
}
// ๊ฐ ๋ฆฌ์คํธ๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
for (int i = 0; i <= N; i++) {
Collections.sort(list[i]);
}
}
// ๋ฌธ์์ด์ ์ ์๋ก ๋ณํํ๋ ํจ์
static int stoInt(String s) {
return Integer.parseInt(s);
}
// BFS ๊ตฌํ
static void BFS(int r) {
int count = 1; // ๋ฐฉ๋ฌธ ์์ ์นด์ดํธ
q.add(r);
isVisited[r] = true;
while (!q.isEmpty()) {
int now = q.poll();
result[now] = count++;
for (int i = 0; i < list[now].size(); i++) {
int num = list[now].get(i);
if (!isVisited[num]) {
q.add(num);
isVisited[num] = true;
}
}
}
}
// ๊ฒฐ๊ณผ ์ถ๋ ฅ
private static void printResult() {
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= N; i++) {
sb.append(result[i]).append("\n");
}
System.out.println(sb);
}
}
๐ ์ฝ๋ ์ค๋ช
๐ 1. ์ ๋ ฅ ์ฒ๋ฆฌ ๋ฐ ๊ทธ๋ํ ์ด๊ธฐํ
N = stoInt(st.nextToken()); // ์ ์ ๊ฐ์
M = stoInt(st.nextToken()); // ๊ฐ์ ๊ฐ์
R = stoInt(st.nextToken()); // ์์ ์ ์
isVisited = new boolean[N + 1]; // ๋ฐฉ๋ฌธ ์ฌ๋ถ ๋ฐฐ์ด
result = new int[N + 1]; // ๋ฐฉ๋ฌธ ์์ ๋ฐฐ์ด
list = new ArrayList[N + 1];
- ์ ์ ๊ฐ์(N), ๊ฐ์ ๊ฐ์(M), ์์ ์ ์ (R) ์ ์ ๋ ฅ๋ฐ์
- isVisited[] ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๊ธฐ๋ก
- result[] ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๋ฐฉ๋ฌธ ์์๋ฅผ ์ ์ฅ
- list[] ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์ ์ฅ
๐ 2. ๊ฐ์ ์ ๋ณด ์ ๋ ฅ ๋ฐ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
for (int i = 0; i <= N; i++) {
list[i] = new ArrayList<>();
}
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
int a = stoInt(st.nextToken());
int b = stoInt(st.nextToken());
list[a].add(b);
list[b].add(a);
}
// ๊ฐ ๋ฆฌ์คํธ๋ฅผ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
for (int i = 0; i <= N; i++) {
Collections.sort(list[i]);
}
- ArrayList[]๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ ๋ฆฌ์คํธ ๋ฐฉ์์ผ๋ก ๊ฐ์ ์ ๋ณด๋ฅผ ์ ์ฅ
- ์ ์ ๋ฒํธ๊ฐ ์์ ์์๋๋ก ๋ฐฉ๋ฌธํ๊ธฐ ์ํด Collections.sort()๋ก ์ ๋ ฌ
๐ 3. BFS ํ์
BFS(R);
- ์์ ์ ์ (R)๋ถํฐ BFS ํ์์ ์์
๐ 4. BFS ํ์ ๊ตฌํ
static void BFS(int r) {
int count = 1; // ๋ฐฉ๋ฌธ ์์ ์นด์ดํธ
q.add(r);
isVisited[r] = true;
while (!q.isEmpty()) {
int now = q.poll();
result[now] = count++;
for (int i = 0; i < list[now].size(); i++) {
int num = list[now].get(i);
if (!isVisited[num]) {
q.add(num);
isVisited[num] = true;
}
}
}
}
- BFS๋ฅผ ์คํํ๋ฉด์ ๋ฐฉ๋ฌธ ์์๋ฅผ ๊ธฐ๋ก
- ํ(Queue)๋ฅผ ์ฌ์ฉํ์ฌ ํ์
- ๋ฐฉ๋ฌธํ์ง ์์ ์ ์ ๋ค์ ์ฐจ๋ก๋๋ก ๋ฐฉ๋ฌธ
๐ 5. ๊ฒฐ๊ณผ ์ถ๋ ฅ
private static void printResult() {
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= N; i++) {
sb.append(result[i]).append("\n");
}
System.out.println(sb);
}
- ๊ฐ ์ ์ ์ ๋ฐฉ๋ฌธ ์์๋ฅผ ์ถ๋ ฅ
๐ฅ ์๊ฐ ๋ณต์ก๋ ๋ถ์
์ฐ์ฐ | ์ต์ ์ ๊ฒฝ์ฐ ์ํ ํ์ | ์๊ฐ ๋ณต์ก๋ |
๊ฐ์ ์ ๋ ฅ ๋ฐ ์ ๋ ฌ | M log M | O(M log M) |
BFS ํ์ | N + M | O(N + M) |
์ดํฉ | O(N + M log M) |
โ ๋น ๋ฅธ BFS ํ์์ด ๊ฐ๋ฅํ๋ฉฐ, ๊ทธ๋ํ์ ํฌ๊ธฐ๊ฐ ํฌ๋๋ผ๋ ํจ์จ์
๐ ์ ๋ฆฌ
โ ํต์ฌ ํฌ์ธํธ
โ BFS๋ฅผ ์ฌ์ฉํ์ฌ ๊ทธ๋ํ๋ฅผ ํ์ํ๋ฉฐ ๋ฐฉ๋ฌธ ์์๋ฅผ ๊ธฐ๋ก
โ ์ ์ ์ด ์์ ์ซ์๋ถํฐ ๋ฐฉ๋ฌธํด์ผ ํ๋ฏ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
โ ๋ฐฉ๋ฌธ ์์๋ result[] ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์ ์ฅ
๐ฏ ์ด ์๊ณ ๋ฆฌ์ฆ์ ์ฅ์
โ
BFS๋ฅผ ํ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ํ์ ๊ฐ๋ฅ
โ
์ธ์ ๋ฆฌ์คํธ + ์ ๋ ฌ์ ํตํด ์ ์ ๋ฐฉ๋ฌธ ์์ ์ ์ด ๊ฐ๋ฅ
โ
O(N + M log M) ์๊ฐ ๋ณต์ก๋๋ก ํจ์จ์ ์ธ ํ์ ๊ฐ๋ฅ
์ด ๊ธ์ด ๋์์ด ๋์ จ๋ค๋ฉด ์ข์์์ ๊ณต์ ๋ถํ๋๋ฆฝ๋๋ค!
'Algorithm & Data Structures > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
b.1707 ์ด๋ถ ๊ทธ๋ํ (0) | 2025.03.12 |
---|---|
b24445. ์๊ณ ๋ฆฌ์ฆ ์์ - ๋๋น ์ฐ์ ํ์ 2 (1) | 2025.03.06 |
b24480. ์๊ณ ๋ฆฌ์ฆ ์์ - ๊น์ด ์ฐ์ ํ์ 2 (0) | 2025.03.01 |
b3015. ์ค์์์ค ์ฌ๊ฒฐํฉ (0) | 2025.02.25 |
b.1725 ํ์คํ ๊ทธ๋จ (0) | 2025.02.06 |