CodingTest/Java
BOJ_9466 : ν νλ‘μ νΈ
Soom_1n
2024. 5. 23. 17:48

πΈ λ¬Έμ λΆμ πΈ
- Tλ²μ ν μ€νΈ μΌμ΄μ€μμμ λ€μκ³Ό κ°μ μ λ ₯μ΄ μ£Όμ΄μ§λ€.
- nλͺ (2~10λ§)μ νμ μκ° μ£Όμ΄μ§κ³ , λ€μ μ€μ κ° νμμ΄ κ°μ΄ νμ νκ³ μΆμ νμμ λ²νΈκ° μ£Όμ΄μ§λ€.
- μκΈ° μμ μ λ½κ±°λ, νμ νκ³ μΆμ νμλ€λΌλ¦¬ μνꡬ쑰(μν΄)μ΄ λ§λ€μ΄μ§λ©΄ νμ λ§λ€ μ μλ€.
- μ΅μ’ μ μΌλ‘ νμ μνμ§ μμ νμμ μλ₯Ό μΆλ ₯νλ€.
πΈ λ¬Έμ νμ΄ πΈ
- μ νμκ° 3μ΄μ κ° ν μ€νΈ μΌμ΄μ€μ nμ΄ 10λ§μ΄κΈ° λλ¬Έμ O(n^2)μ μκ³ λ¦¬μ¦μ μ¬μ©ν μ μλ€.
- νμ΄ λ§λ€μ΄μ§λμ§ νμΈνκΈ° μν΄ κΉμ΄ μ°μ νμ(DFS)λ₯Ό μ¬μ©νλ€.
- DFSμ κ²½μ°μ μλ λ€μκ³Ό κ°λ€.
- 1) νμνλ€κ° μμ λ²νΈλ₯Ό λ€μ μ°Ύμ : νμν λͺ¨λ νμλ€μ κ°μ ν
- 2) νμνλ€κ° μ€κ° λ²νΈλ₯Ό λ€μ μ°Ύμ : μ€κ° λ²νΈκΉμ§ νμ΄κ³ , μμ λ²νΈλΆν° μ€κ° λ²νΈ μ¬μ΄λ νμ λ§λ€ μ μμ
- 3) μ΄λ―Έ ν μμμ΄ μλ λ²νΈ : μμ λ²νΈλΆν° νμ¬κΉμ§ λͺ¨λ νμ λ§λ€ μ μλ νμ λ²νΈ
- nλͺ μ νμλ€μ΄ λͺ¨λ λ²νΈλ₯Ό κ°λ¦¬ν€κ³ μμΌλ―λ‘, DFS νμμ νμ μ 3κ°μ§ κ²½μ°μ λμ λ³΄κ² λλ€. κ·Έλ¦¬κ³ 1λ²κ³Ό 2λ²μ μ¬μ€μ κ°μ κ²½μ°λΌκ³ λ³Ό μ μλ€.
- μ€μν건 νλ² νμν λ²νΈλ λ€μ DFSλ₯Ό νμνμ§ μκ²ν΄μ O(n)μ μκ° λ³΅μ‘λλ₯Ό λ§λλ κ²μ΄λ€.
πΈ μ½λ πΈ
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
private static int[] pick, visited;
private static boolean[] isTeam;
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;
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for (int t = 0; t < T; t++) {
int n = Integer.parseInt(br.readLine());
pick = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
pick[i] = Integer.parseInt(st.nextToken()) - 1;
}
int cnt = 0; // νμ΄ μλ μ λ€ μ
isTeam = new boolean[n]; // ν μμ μ¬λΆ
visited = new int[n]; // λ°©λ¬Έ 체ν¬
Arrays.fill(visited, -1);
for (int i = 0; i < n; i++) {
if (visited[i] == -1 && !isTeam[i]) { // λ°©λ¬Έ μνκ³ , ν μμΌλ©΄ dfs λλ¦Ό
dfs(i, i);
}
if (!isTeam[i]) { // dfs νμλ ν μμΌλ©΄ μΉ΄μ΄νΈ
cnt++;
}
}
sb.append(cnt).append('\n');
}
bw.write(sb.toString());
bw.flush();
}
private static int dfs(int now, int start) {
// λ°©λ¬Έ νμμ
if (visited[now] > -1) {
if (visited[now] == start) { // νμ¬ νμμ λ°©λ¬Έν¨ : μν΄ λ°μ
isTeam[now] = true;
return now;
} else { // νμ΄ μμ or μ΄μ λ°©λ¬Έ
return -1;
}
}
visited[now] = start;
// μ¬κ·
int result = dfs(pick[now], start);
if (result > -1 && now != result) { // νμ¬ μν΄ μμͺ½μ
isTeam[now] = true;
return result;
}
// μ¬κ· λλμ κ°λ©° μ²λ¦¬ ν κ±° μμ, μν΄μ’
λ£
return -1;
}
}
πΈ μ½λ ν΄μ πΈ
- νμ λ³ μ ν λ²νΈλ₯Ό μ μ₯νλ int λ°°μ΄ pick, ν μμμ΄ μμμ λνλ΄λ boolean λ°°μ΄ isTeam, νμ μ μμ λ²νΈλ₯Ό μ μ₯νλ intλ°°μ΄ visitedλ₯Ό μ¬μ©νλ€.
- nκ°μ λ²νΈμ λ€μκ³Ό κ°μ κ³μ°μ λ°λ³΅νλ€.
- λ°©λ¬Ένμ§ μμκ³ , νμ΄ μμΌλ©΄ dfs() λ©μλλ₯Ό λλ¦°λ€.
- μ΄νμλ νμ΄ μμΌλ©΄ cntλ₯Ό +1 νλ€.
- dfs μ¬κ· λ©μλμμλ λ€μκ³Ό κ°μ κ³μ°μ λ°λ³΅νλ€.
- λ°©λ¬Έ νμΈ
- νμ¬ νμμ λ°©λ¬Ένλ λ²νΈλΌλ©΄, μν΄μ΄ λ°μν κ²μ΄λ―λ‘, λ€μ νμ¬ λ²νΈκ° λμ¬ λ κΉμ§ isTeam[now]μ trueλ‘ μ μνκ³ nowλ₯Ό λ°ννλ€.
- μ΄μ νμ λ°©λ¬Ένλ λ²νΈλΌλ©΄, μν΄μ΄ λ§λ€μ΄μ§μ§ μμΌλ―λ‘ -1μ λ°ννλ€.
- λ°©λ¬Ένμ§ μμλ λ²νΈλΌλ©΄ λ°©λ¬Έμ²λ¦¬νλ€.
- μ¬κ· κ²°κ³Ό μ²λ¦¬
- dfs(pick[now], start) λ‘ λ€μ μ¬κ· λ©μλλ₯Ό μ€ννλ€.
- λ§μ½ μ¬κ· λ©μλμ λ°νκ° resultκ° 0μ΄μμ΄κ³ nowμ λ€λ₯΄λ€λ©΄, μν΄ μ€κ°μ΄λ―λ‘ istTeam[now]λ₯Ό trueλ‘ λ°κΏμ£Όκ³ resultλ₯Ό λ°ννλ€.
- resultκ° -1μ΄κ±°λ result == nowλΌλ©΄ μν΄μ΄ μ’ λ£λ κ²μ΄λ―λ‘ -1μ λ°ννλ€.
- λ°©λ¬Έ νμΈ
πΈ end πΈ
- λ¨μν DFS μκ³ λ¦¬μ¦λ§ νμν λ¬Έμ μΈλ°, λμ΄λκ° κ½€ λμλ κ² κ°λ€.
- κ° ν μ€νΈ μΌμ΄μ€ μ€νμ μκ° λ³΅μ‘λλ₯Ό O(n)μΌλ‘ ν΄μΌλΌμ 1ν μκ° μ΄κ³Ό λ¬λ€.
- 2λ²μ§Έ μ μΆμ νλ Έμ΅λλ€λ μ΄μ νμμμ νμ΄ μμμ μμλλ°, νμ¬ νμμμ λ€μ λ°©λ¬Έν΄μΌ ν κ²½μ°μ μ€λ₯κ° λμ νλ Έλ€. visitedλ₯Ό μ²μμ boolean λ°°μ΄λ‘ λλ€κ°, μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ startλ₯Ό κΈ°λ‘νκ³ visitedλ₯Ό intλ°°μ΄λ‘ λ°κΏμ μ²λ¦¬νλ€.
- ꡬννλ λ°©λ²μ΄ λ€μνκ² μλ λ¬Έμ μΈ κ² κ°λ€.
- ν μ€νΈ μΌμ΄μ€λ₯Ό λ€μνκ² λλ €λ³΄λ©΄μ λλ²κΉ νλκ² μ€μν κ² κ°μμ, μ§μ λ§λ€κΈ°λ νκ³ μ§λ¬Έ κ²μνμ μλ λ°λ‘λ€μ λͺ¨μΌκΈ°λ νλ€.
- ν μ€νΈ μΌμ΄μ€ λͺ¨μμ μ§λ¬Έ κ²μνμ λ¨κ²¨λμλ€.

728x90