https://www.acmicpc.net/problem/10775
ํด๋น ๋ฌธ์ ๋ Greedy๋ก ๊ฐ ๋นํ๊ธฐ์ ์ฃผ์ด์ง gi๊ฐ๋ณด๋ค ์์ ์ ์ค์์ ๋น์ด์๋ ๊ฒ์ดํธ์ ๋นํ๊ธฐ๋ฅผ ์ฐ๊ฒฐ์ํค๋ฉด ๋๋ ๊ฐ๋จํ ๋ฌธ์ ์ด๋ค.
ํ์ง๋ง ์ผ๋ฐ์ ์ธ Greedy๋ฐฉ์์ผ๋ก ๋ฌธ์ ๋ฅผ ํ๊ฒ ๋๋ค๋ฉด ๋ฌธ์ ์ ์ฃผ์ด์ง ์๊ฐ์ ํ์ด ์งง์ ์๊ฐ์ด๊ณผ๋ผ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๊ฒ ๋๋ค.
๊ทธ๋์ ๋ฌธ์ ๋ฅผ ํต๊ณผ์ํค๊ธฐ ์ํด์๋ ์๋์ ์์ฑํ ์ฝ๋์ ๊ฐ์ด Union-find ์ฝ๋๋ฅผ ์์ฑํ์ฌ ๊ฐ๊ฐ์ parent๋ฅผ ํตํด ๋น์ด์๋ ์์น๋ฅผ ์ฐพ์ ์ฐ์ฐ์ ์๊ฐ์ ์ค์ฌ์ผํฉ๋๋ค.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
static int[] parent;
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int G = Integer.parseInt(br.readLine());
int P = Integer.parseInt(br.readLine());
parent = new int[G+1];
for (int i=0; i<=G; i++) parent[i] = i;
int count = 0;
for (int i=0; i<P; i++) {
int g = Integer.parseInt(br.readLine());
int parentGate = find(g);
if (parentGate != 0) {
count++;
union(parentGate-1, parentGate);
}
else break;
}
System.out.println(count);
}
static int find(int g) {
if (parent[g] == g) return g;
return parent[g] = find(parent[g]);
}
static void union(int g1, int g2) {
int p1 = find(g1);
int p2 = find(g2);
if (p1 < p2) parent[p2] = p1;
else parent[p1] = p2;
}
}