💻 C++ 기반
✔️ visited 배열에 bool값이 아닌 int값을 넣어주면 반복문을 돌 때마다 초기화를 안 해줘도 되므로 시간 복잡도가 O(N)이 된다.
#include <cstdio>
#include <queue>
#include <utility>
#include <algorithm>
#define MAX 100001
using namespace std;
int choices[MAX];
int visited[MAX];
void search(int n, int start)
{
int cur = start;
while (1)
{
visited[cur] = start;
cur = choices[cur];
if (visited[cur] == start)
{
while (visited[cur] != -1)
{
visited[cur] = -1;
cur = choices[cur];
}
return;
}
else if (visited[cur] != 0)
{
return;
}
}
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int n;
scanf("%d", &n);
fill(visited + 1, visited + n + 1, 0);
for (int i = 1; i <= n; i++)
{
scanf("%d", &choices[i]);
}
for (int i = 1; i <= n; i++)
{
if (visited[i] == 0)
{
search(n, i);
}
}
int cnt = 0;
for (int i = 1; i <= n; i++)
{
if (visited[i] != -1)
{
cnt++;
}
}
printf("%d\n", cnt);
}
return 0;
}