๋ฌธ์
ํด๋น ํฌ์คํ ์ ๋ฐฑ์ค์ 10451๋ฒ ์์ด ์ฌ์ดํด ์ ์ ๊ทผ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ค๋ช ํ ๊ธ ์ ๋๋ค.
์ ๋ต ์์ค ์ฝ๋๋ฅผ ํ์ธํ์๋ ค๋ฉด solve url ์์ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๊ทผํด์ผ ํ๋์ง๋ฅผ ๋จผ์ ์๊ฐํด๋ณด์.
ํด๊ฒฐ๋ฒ
์ด๋ฒ ๋ฌธ์ ๋ ์ง๋๋ฒ ํ์๋ ์ฐ๊ฒฐ ์์์ ๊ฐ์๋ฌธ์ ์ ๋งค์ฐ ์ ์ฌํ ๋ฌธ์ ์ด๋ค.
๋ฌธ์ ๊ฐ ์ด์ผ๊ธฐํ๊ณ ์๋ ๊ฒ์ ์ด๋ ๋ค.
์์ด์ ๊ธธ์ด๊ฐ ๋จผ์ ์ฃผ์ด์ง๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ธธ์ด๋งํผ ์์ด์ด ๋ค์ด์ค๋๋ฐ, ๊ทธ ์์ด์ 1 ~ N ๊น์ง ์์๋๋ก ๋์ดํ ์์ด์ ์ธ๋ฑ์ค์ 1:1 ๋งค์นญ๋์ด ํด๋น ๋งค์นญ ์์ฒต๊ฐ ๊ทธ๋ํ ๋
ธ๋์ ์ฐ๊ฒฐ ์ํ๋ผ๊ณ ํ๋ค.
๋ฌธ์ ์ ํน์ฑ์ ์์ด๋ก ๋ง๋ ๊ทธ๋ํ๋ ๋ฌด์กฐ๊ฑด ์ฌ์ดํด์ ๊ฐ๊ฒ ๋๋ค.
๊ทธ๋ผ ์ง๋๋ฒ ํ์๋ ์ฐ๊ฒฐ ์์์ ๊ฐ์๋ฌธ์ ์ ๋์ผํ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ด๋ค.
์ค๋ต ํ๋ณด
์ด ๋ฌธ์ ๋ ๋ฐฉํฅ์ด ์๋ ๋ฐฉํฅ ๊ทธ๋ํ์ด๋ค.
์ธ์ ๋ฆฌ์คํธ๋ฅผ ๊ตฌํํ ๋ ์๋ฐฉํฅ์ด ์๋๊ธฐ ๋๋ฌธ์ graph.add๋ฅผ ํ ๋ฒ๋ง ์ํํ๋ฉด ๋๋ค.
์๋ฐฉํฅ(๋ฌด๋ฐฉํฅ) ๊ทธ๋ํ ์์ ์ถ๊ฐ.
for (int i = 1; i <= n; i++) {
graph.get(n1).add(n2);
graph.get(n2).add(n1);
}
๋จ๋ฐฉํฅ(๋ฐฉํฅ) ๊ทธ๋ํ ์์ ์ถ๊ฐ.
for (int i = 1; i <= n; i++) {
graph.get(n1).add(n2);
}
์ ๋ต ์ฝ๋
public class Main {
static ArrayList<ArrayList<Integer>> graph;
static boolean[] visited;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int t = Integer.parseInt(br.readLine());
while(t-- > 0) {
int n = Integer.parseInt(br.readLine());
visited = new boolean[n + 1];
graph = new ArrayList<>();
for (int i = 0; i <= n; i++) {
graph.add(new ArrayList<>());
}
String[] seq = br.readLine().split(" ");
for (int i = 1; i <= n; i++) {
int number = Integer.parseInt(seq[i-1]);
graph.get(i).add(number);
}
int answer = 0;
for (int i = 1; i <= n; i++) {
if(dfs(i)) answer++;
}
bw.write(answer + "\n");
bw.flush();
}
bw.close();
}
private static boolean dfs(int x) {
if(visited[x]) return false;
visited[x] = true;
for(int value: graph.get(x)) {
if (!visited[value]) dfs(value);
}
return true;
}
}
๋ฌธ์ ํ๊ณ
์ด๋ฒ ๋ฌธ์ ๋ ์ง๋ DFS์ BFS์ฒ๋ผ ์ถ๋ ฅ ์ฒ๋ฆฌ๋ฅผ ์ ๋๋ก ํ์ง ์์์ 2๋ฒ์ด๋ ํ๋ ธ๋ ๋ฌธ์ ์ด๋ค.
์ ๋ฒ์ ๋ถ๋ช ์ถ๋ ฅ ์ฒ๋ฆฌ ์ ํ์๊ณ ๋ค์ง ํ๋๋ฐ,, ๋ฉ์ฒญ์ธ๊ฐ๋ณด๋ค.
๋๊ธ