알고리즘
[백준 9466] 텀 프로젝트
kyeongjun-dev
2020. 3. 12. 17:07
#include<iostream>
#include<stack>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int cas;
cin >> cas;
while (cas--) {
stack<pair<int, int>>s;
int account = 0;
int num = 0;
int len;
cin >> len;
int *arr = new int[len + 1]();
int *visit = new int[len + 1]();
for (int i = 1; i < len + 1; i++) {
cin >> arr[i];
}
for (int i = 1; i < len + 1; i++) {
num = 0;
if (visit[i] == 0) {
visit[i] = 1;
s.push(make_pair(i, arr[i]));
int next = arr[i];
while (visit[next] == 0) {
s.push(make_pair(next, arr[next]));
visit[next] = 1;
next = arr[next];
}
if (!s.empty()) {
while (1) {
if (s.empty()) {
num = 0;
break;
}
if (s.top().first == next) {
num++;
break;
}
num++;
s.pop();
}
while (!s.empty())
s.pop();
}
account += num;
}
}
cout << len - account << '\n';
delete[] arr;
delete[] visit;
}
return 0;
}
DFS 문제인건 알았는데, 스택 안쓰고 1차원 배열 두개로만 해결하려다가 7시간동안 안풀려서 포기....
Stack으로 푸니까 바로 성공... ㅠ_ㅠ