From 7ff67bae490fcd6f3201ebed42aa4a5d0539669f Mon Sep 17 00:00:00 2001 From: LiiNi-coder <97495437+LiiNi-coder@users.noreply.github.com> Date: Sat, 20 Sep 2025 23:58:27 +0900 Subject: [PATCH] =?UTF-8?q?[20250920]=20BOJ=20/=20G3=20/=20=ED=85=80=20?= =?UTF-8?q?=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20/=20=EC=9D=B4=EC=9D=B8?= =?UTF-8?q?=ED=9D=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04\353\241\234\354\240\235\355\212\270.md" | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 "LiiNi-coder/202509/20 BOJ \355\205\200 \355\224\204\353\241\234\354\240\235\355\212\270.md" diff --git "a/LiiNi-coder/202509/20 BOJ \355\205\200 \355\224\204\353\241\234\354\240\235\355\212\270.md" "b/LiiNi-coder/202509/20 BOJ \355\205\200 \355\224\204\353\241\234\354\240\235\355\212\270.md" new file mode 100644 index 00000000..6949bf57 --- /dev/null +++ "b/LiiNi-coder/202509/20 BOJ \355\205\200 \355\224\204\353\241\234\354\240\235\355\212\270.md" @@ -0,0 +1,65 @@ +```java +import java.io.*; +import java.util.*; + +public class Main { + static int n; + static int[] arr; + static boolean[] visited; + static int answer = 0; + static int[] indegree; + + public static void main(String[] args) throws IOException { + BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + int t = Integer.parseInt(br.readLine()); + while(t-- > 0){ + n = Integer.parseInt(br.readLine()); + arr = new int[n + 1]; + visited = new boolean[n + 1]; + StringTokenizer st = new StringTokenizer(br.readLine()); + for (int i = 1; i <= n; i++) { + arr[i] = Integer.parseInt(st.nextToken()); + } + + for (int i = 1; i <= n; i++) { + if (!visited[i]) { + dfs(i); + } + } + + System.out.println(n - answer); + } + + } + + static void dfs(int start) { + Map map = new HashMap<>(); + List path = new ArrayList<>(); + + int cur = start; + while (true) { + if (visited[cur]) { + break; + } + + visited[cur] = true; + map.put(cur, path.size()); + path.add(cur); + int next = arr[cur]; + //다음 학생이 범위를 벗어나면 즉시 종료(ㅣ사이클 없으니까) + if (next < 1 || next > n) break; + + if (!map.containsKey(next)) { + cur = next; + continue; + } else { + //사이클 발견 + int idx = map.get(next); + answer += path.size() - idx; + break; + } + } + } +} + +```