Tags
- ๊ทธ๋ํ ์ด๋ก
- sort
- BOJ
- ์๋ฎฌ๋ ์ด์
- Study
- greedy
- BFS
- ์ ์๋ก
- ๋ฌธ์์ด
- ๊ตฌํ
- ๊ต์ฌ
- Python
- PGM
- SpringBoot
- Brute Force Algorithm
- stack
- ์๋ฃ๊ตฌ์กฐ
- ๊ทธ๋ํ ํ์
- CodingTest
- ์ ๋ ฌ
- DP
- ๋ฐฑํธ๋ํน
- Java
- queue
- dfs
- ๋๋น ์ฐ์ ํ์
- ๊น์ด ์ฐ์ ํ์
- Dynamic Programming
- LV2
- ์ํ
Archives
๊ธฐ๋ก๋ฐฉ
BOJ_1647 : ๋์ ๋ถํ ๊ณํ ๋ณธ๋ฌธ
๐ธ ๋ฌธ์ ๋ถ์ ๐ธ
- N๊ฐ์ ์ง๊ณผ M๊ฐ์ ์ง ์ฌ์ด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ธธ์ด ์๋ค.
- ์๋ก ์ด์ด์ง์ง ์๋ ๋ง์ 2๊ฐ๋ฅผ ๋ง๋๋ ค๊ณ ํ๋๋ฐ, ๊ฐ ๋ง์ ์์์๋ ์ง๋ผ๋ฆฌ ๊ธธ์ด ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๋ค.
- ๊ธธ์ ์ ์ง๋น ํฉ์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ธ ๋ฌธ์ ํ์ด ๐ธ
- ๋ง์ ์์์ ์ง ์ฌ์ด์ ๊ธธ์ด ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๊ณ , ๊ทธ ๊ฐ์ค์น๊ฐ ์ต์๊ฐ ๋์ด์ผ ํ๋ฏ๋ก, ๋ ๊ฐ์ ์ต์ ์ ์ฅ ํธ๋ฆฌ(MST) ๊ฐ ๋ง๋ค์ด์ ธ์ผ ํ๋ค.
- ์ฌ๊ธฐ์๋ ํฌ๋ฃจ์ค์นผ(Kruskal) ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค.
- ๊ฐ์ ์ ๋ชจ๋ ์ ๋ ฅ๋ฐ๊ณ , ์ ์ง๋น ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
- ์ฐจ๋ก๋ก ์งํฉ์ ํฉ์น ์ ์๋์ง Union-Find๋ก ํ์ธํ๋ฉฐ, ์งํฉ์ด 2๊ฐ๊ฐ ๋ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
- ์ต์ข ๋์ ์ ์ง๋น๋ฅผ ์ถ๋ ฅํ๋ค.
๐ธ ์ฝ๋ ๐ธ
import java.io.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main {
private static int[] parent;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
if (N == 2) {
bw.write("0");
bw.flush();
return;
}
parent = new int[N + 1];
for (int i = 1; i <= N; i++) {
parent[i] = i;
}
Edge[] edges = new Edge[M];
for (int i = 0; i < M; i++) {
st = new StringTokenizer(br.readLine());
edges[i] = new Edge(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
}
Arrays.sort(edges, Comparator.comparing(o -> o.cost));
long answer = 0;
int set = N;
for (Edge e : edges) {
if (union(e.start, e.end)) {
set--;
answer += e.cost;
}
if (set == 2) break;
}
bw.write(Long.toString(answer));
bw.flush();
}
private static boolean union(int a, int b) {
int ap = find(a);
int bp = find(b);
if (ap == bp) {
return false;
} else {
parent[bp] = ap;
return true;
}
}
private static int find(int a) {
if (parent[a] == a) {
return a;
}
return parent[a] = find(parent[a]);
}
private static class Edge {
int start, end, cost;
public Edge(int start, int end, int cost) {
this.start = start;
this.end = end;
this.cost = cost;
}
}
}
๐ธ ์ฝ๋ ํด์ ๐ธ
- ์ง์ ๊ฐ์ N๊ณผ ๊ฐ์ ์ ๊ฐ์ M์ ์ ๋ ฅ๋ฐ๋๋ค. N์ด 2์ด๋ฉด ๊ฐ์ ์ ์ ์๊ด ์์ด 0์ ์ถ๋ ฅํ๋ค.
- Union-Find์์ ์งํฉ ํ์ธ์ ์ํ ๋ถ๋ชจ ์ธ๋ฑ์ค ์ ์ฅ ๋ฐฐ์ด parent๋ฅผ ๋ง๋ค์ด ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๋ค.
- ๋ ์ธ๋ฑ์ค์ ์ ์ง๋น๋ฅผ ์ ์ฅ ํ ๊ฐ์ ํด๋์ค Edge๋ฅผ ๋ง๋ค์ด ๊ฐ์ ์ด๊ธฐํํ๋ค.
- Edge๋ฐฐ์ด edges๋ฅผ ์ ์ง๋น ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
- ๊ฐ ๊ฐ์ ์ ์ค๋ฆ์ฐจ์์ผ๋ก ํ์ธํ๋ฉฐ, ์งํฉ์ด ํฉ์ณ์ง๋ฉด ์งํฉ ๊ฐ์ set์ -1ํ๊ณ ์ ์ง๋น๋ฅผ answer์ ๋์ ํ๋ค.
- ์ต์ข answer์ ์ถ๋ ฅํ๋ค.
๐ธ end ๐ธ
- ์ฒ์์ 97%์์ ํ๋ ค์ answer๊ฐ int๊ฐ ์๋๋ผ long์ด์ด์ ๊ทธ๋ฐ๊ฐํ๊ณ ๊ณ ์ณค์ง๋ง ์ฌ์ ํ ํ๋ ธ๋ค.
- answer์ ์ต๋๊ฐ์ 10์ต์ผ๋ก int๋ก ๊ฐ๋ฅํ๋ค๊ณ ๊ณ์ฐํ์๋๋ฐ, ์๋๋ ๋ค๋ฅผ๊น ์ด์์์๋ค.
- ํ๋ฆฐ ์์ธ์ n์ด 2์ผ ๋๋ union์ด ํ์์๋๋ฐ, ์ฝ๋๋ ๋ฌด์กฐ๊ฑด ํ ๋ฒ union์ด ์ด๋ฃจ์ด ์ง๋๋ก ๋ง๋ค์๊ธฐ ๋๋ฌธ์ด๋ค.
- lowcase๋ฅผ ํ์ธํ๋ ค๊ณ 1 2 / 1 2 3 ์
๋ ฅ์ ํ์๋๋ฐ, ๋ฐ๋ณด๊ฐ์ด 3์ด ๋์จ๊ฑธ ํ์ธํ๊ณ ์ด์์ด ์๋์ง ๋ชฐ๋๋ค.
- 0์ด ๋์์ผ ์ ์์ด์๊ณ , ํ๋ฆฐ ์ดํ์ ์ง๋ฌธ ๊ฒ์ํ์ ๋ณด๊ณ ๊นจ๋ฌ์๋ค.
- ๋ญ๊ฐ ๋ค๋ฅธ ์ด์ ๊ฐ ์์๊ฑฐ๋ผ๊ณ ์๊ฐํ๊ณ , ์ง์ ๊ณ์ฐํ๊ณ ํ ์คํธํ ์ผ์ด์ค๋ฅผ ๊ฐ๊ณผํ๊ฒ ๋ถ๋๋ฝ๋ค.
- ์ง๋ฌธ ๊ฒ์ํ์ ๋ณด๊ธฐ์ ์ ๋๋์ฑ ๊ผผ๊ผผํ๊ฒ ๊ฒ์ฌํ๋ ๋ฒ๋ฆ์ ๋ค์ฌ์ผ๊ฒ ๋ค. ์กฐ๊ธ ์๊ฑด๋ฐฉ์ง ํ ๋์๋ ๊ฒ ๊ฐ๋ค.
- ์๊ธด๊ฑด '์ ์ด๊ฑฐ 2๊ฐ ์งํฉ ๋๋ ์ ํ์ธํด์ผ ํ๋๊น, ์ ๋ ฌํ๊ณ Union-Find' ์ฐ๋ฉด ๋๊ฒ ๋ค' ํ๊ณ ๋ฌธ์ ํ์ดํ ๋ค ์ง๋ฌธ๊ฒ์ํ์ MST, ํฌ๋ฃจ์ค์นผ, ํ๋ฆผ ์๊ธฐ๊ฐ ๋์์ ์ ๊ทธ๋ ๊ฒ ํ์ดํ์ง? ํ๊ณ ์๋ฌธ์ ๊ฐ์๋ค.
- ์๊ณ ๋ณด๋ ๋ด ํ์ด๊ฐ ํฌ๋ฃจ์ค์นผ์ด์๋ค...๋๋ฌด ์์ฐ์ค๋ฝ๊ฒ ์๊ฐํ๋๋ฐ MST ์๊ณ ๋ฆฌ์ฆ ์ด๋ก ์ด ๋ง์ด ๋น์ฝํ๋ค๋๊ฑธ ๋ค์ ํ๋ฒ ๊นจ๋ฌ์๋ค.
- ์ด๋ฒ์ ์๊ณ ๋ฆฌ์ฆ ํ์ด ๊ณํ์ ์ ์ด๊ฐ๋ฉฐ ํ์ดํ๋ค.
728x90
'CodingTest > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
BOJ_20040 : ์ฌ์ดํด ๊ฒ์ (0) | 2024.03.29 |
---|---|
BOJ_18352 : ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ (0) | 2024.03.27 |
BOJ_1197 : ์ต์ ์คํจ๋ ํธ๋ฆฌ (0) | 2024.03.13 |
BOJ_27172 : ์ ๋๋๊ธฐ ๊ฒ์ (0) | 2024.03.12 |
BOJ_2166 : ๋ค๊ฐํ์ ๋ฉด์ (0) | 2024.03.11 |