ํ ํ๋ก์ ํธ(๋ฌธ์ _ 9466)
์ด๋ฒ ๊ฐ์ํ๊ธฐ์ '๋ฌธ์ ํด๊ฒฐ' ๊ฐ์๋ฅผ ์ ์ฒญํ ํ์๋ค์ ํ ํ๋ก์ ํธ๋ฅผ ์ํํด์ผ ํ๋ค. ํ๋ก์ ํธ ํ์ ์์๋ ์ ํ์ด ์๋ค. ์ฌ์ง์ด ๋ชจ๋ ํ์๋ค์ด ๋์ผํ ํ์ ํ์์ธ ๊ฒฝ์ฐ์ ๊ฐ์ด ํ ํ๋ง ์์ ์๋ ์๋ค. ํ๋ก์ ํธ ํ์ ๊ตฌ์ฑํ๊ธฐ ์ํด, ๋ชจ๋ ํ์๋ค์ ํ๋ก์ ํธ๋ฅผ ํจ๊ปํ๊ณ ์ถ์ ํ์์ ์ ํํด์ผ ํ๋ค. (๋จ, ๋จ ํ ๋ช ๋ง ์ ํํ ์ ์๋ค.) ํผ์ ํ๊ณ ์ถ์ดํ๋ ํ์์ ์๊ธฐ ์์ ์ ์ ํํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
ํ์๋ค์ด(s1, s2, ..., sr)์ด๋ผ ํ ๋, r=1์ด๊ณ s1์ด s1์ ์ ํํ๋ ๊ฒฝ์ฐ๋, s1์ด s2๋ฅผ ์ ํํ๊ณ , s2๊ฐ s3๋ฅผ ์ ํํ๊ณ ,..., sr-1์ด sr์ ์ ํํ๊ณ , sr์ด s1์ ์ ํํ๋ ๊ฒฝ์ฐ์๋ง ํ ํ์ด ๋ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ํ ๋ฐ์ 7๋ช ์ ํ์์ด ์๋ค๊ณ ํ์. ํ์๋ค์ 1๋ฒ๋ถํฐ 7๋ฒ์ผ๋ก ํํํ ๋, ์ ํ์ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ๋ค.
1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|
3 | 1 | 3 | 7 | 3 | 4 | 6 |
์์ ๊ฒฐ๊ณผ๋ฅผ ํตํด (3)๊ณผ (4, 7, 6)์ด ํ์ ์ด๋ฃฐ ์ ์๋ค. 1, 2, 5๋ ์ด๋ ํ์๋ ์ํ์ง ์๋๋ค.
์ฃผ์ด์ง ์ ํ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ์ด๋ ํ๋ก์ ํธ ํ์๋ ์ํ์ง ์๋ ํ์๋ค์ ์๋ฅผ ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ ์ค์๋ ํ์์ ์๊ฐ ์ ์ n (2 ≤ n ≤ 100,000)์ผ๋ก ์ฃผ์ด์ง๋ค.
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋์งธ ์ค์๋ ์ ํ๋ ํ์๋ค์ ๋ฒํธ๊ฐ ์ฃผ์ด์ง๋ค. (๋ชจ๋ ํ์๋ค์ 1๋ถํฐ n๊น์ง ๋ฒํธ๊ฐ ๋ถ์ฌ๋๋ค.)
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค ํ ์ค์ ์ถ๋ ฅํ๊ณ , ๊ฐ ์ค์๋ ํ๋ก์ ํธ ํ์ ์ํ์ง ๋ชปํ ํ์๋ค์ ์๋ฅผ ๋ํ๋ด๋ฉด ๋๋ค.
์์
2
7
3 1 3 7 3 4 6
8
1 2 3 4 5 6 7 8
answer :
2
0
ํ์ด
์ค๋ช ์ฐธ๊ณ - https://hibee.tistory.com/152
์ฌ์ดํด์ด ํ์ฑ ๋์๋ค๋ฉด ๊ทธ ์ฌ์ดํด์ ์ํด์๋ ํ์๋ค์ ํ ํ์ด ๋๋ค. ์ฆ ์ฌ์ดํด์ด ํ์ฑ ๋์๋์ง ํ๋จํ๋ ๊ฒ ์ด๋ฒ ๋ฌธ์ ์ ํ์ด๋ฒ์ด๋ค.
์ฌ์ดํด ํ๋จ์ dfs์ ์ฌ์ฉํ๋ฉด ๋๋ค. dfs๋ ๋์ด์ ๋์๊ฐ ์ ์์ ๋๊น์ง ํ ์ ์ ์ ํ๊ณ ๋ค๊ธฐ ๋๋ฌธ์ด๋ค. (๊น์ด์ฐ์ )
ํ์ง๋ง ์ด๋ฒ ๋ฌธ์ ๋ ํ ์คํธ ์ผ์ด์ค์ ํฌ๊ธฐ๊ฐ ํฌ๊ธฐ ๋๋ฌธ์ ๋จ์ํ dfs๋ฅผ ์ด์ฉํ๋ค๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋๊ฒ ๋๋ค. (ํ์ ํ๋๋ง๋ค dfs๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ - visited ๋ฐฐ์ด ์ด๊ธฐํ ๊ณผ์ ์์ ์๊ฐ์ด ๋ง์ด ๋ ๋ค)
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ visited ๋ฐฐ์ด ์ด๊ธฐํ ์์ด ์ฌ์ดํด ํ๋จ์ ํ ํ์๊ฐ ์๋ค.
์์์ผ ํ ์
๋ชจ๋ ํ์์ด ํ๋ช
์ ๊ผญ ์ง๋ชฉํ๊ธฐ ๋๋ฌธ์, ์ด๋ค ์ ์ ์์ dfs๋ฅผ ์์ํ๋ ์ฌ์ดํด์ ํฌํจํ๋ ๊ฒฝ๋ก๊ฐ ๋์ค๊ฒ ๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ค์ ๋
ธ๋๊ฐ ์ด๋ฏธ ์ฌ์ดํด์ ํ์ฑ ํ๋์ง, ํ์ฑ์ ์คํจ ํ ๊ฑด์ง ํ์ธํ๋ฉด ๊ตณ์ด ๋๊น์ง ํ์ธํ ํ์๊ฐ ์๋ค.
ํ์ 1 , 2 ๊ฐ ์๋ ๊ฒฝ์ฐ
1->1 / 2->1 ————-> [1] ์ฌ์ดํด
1->1 / 2->2 ————-> [1],[2] ์ฌ์ดํด
1->2 / 2->1 ————-> [1,2] ์ฌ์ดํด
1->2 / 2->2 ————-> [2] ์ฌ์ดํด
๋ฐฐ์ด
-
visited[] == false : dfs ํ์์ ์งํํ์ง ์์ ๋ ธ๋
-
finished[] : ์ด๋ฏธ ๋ฐฉ๋ฌธํ๋ ๋ ธ๋๋ฅผ ๋ ๋ฐฉ๋ฌธํ๋๊น, ํ์ฌ ๋ ธ๋๋ฅผ ํฌํจํ ์ฌ์ดํด์ด ์๊ฒผ๊ฑฐ๋, ํ์ฌ ๋ ธ๋๋ฅผ ์ ์ธํ ์ฌ์ดํด์ด ์ด๋ฏธ ์๊ฒจ์๋ ๊ฒฝ์ฐ
-
finished[] == false : ์๋ก์ด ์ฌ์ดํด์ด ์๊ธฐ๋ ๊ฒฝ์ฐ. cnt ์ฆ๊ฐ ํ์
-
finished[] == true : ์ฌ์ดํด ํ๋จ์ด ๋์ด ์๋ ๊ฒฝ์ฐ. ์ด๋ฏธ ์ฌ์ดํด ํ๋จ์ด ๋์ด์๋ค๋ฉด ํ์ฌ ๋ ธ๋๊ฐ ๊ทธ ์ฌ์ดํด์ ํฌํจ๋์ด ์์๋ค๋ฉด ์ด๋ฏธ dfs๋ฅผ ์งํํด visited๊ฐ true์์ ๊ฒ์. ํ์ง๋ง ๋ฐฉ๋ฌธ์กฐ์ฐจ ํ์ง ์์๊ธฐ ๋๋ฌธ์ ํด๋น ์ฌ์ดํด์ ์ด๋ฒ ๋ ธ๋ ํฌํจ ์๋์ด ์์. ์ฌ์ดํด ํ์ฑ ์คํจ
โ๏ธfor๋ฌธ์์ if(!visited[])ํ๋ ์ด์ โ๏ธ
๋ง์ฝ 1->2->3->4->5->4 ์ด๋ผ๋ฉด dfs(1)์ ์งํํ ๋ 1,2,3,4,5 ๋ ธ๋๋ฅผ ๋ชจ๋ ๋ฐฉ๋ฌธํ๊ณ ์ฌ์ดํด ํ๋จ๊น์ง ๋ง์น๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐฉ๋ฌธํ ๋ ธ๋๋ ์ฌ์ดํด ํ๋จ์ด ๋๋ ์๋ค๊ณ ์๊ฐํด๋ ๋จ. ๋์ด์ dfs๋ก ํ์ํ ์ด์ ๊ฐ ์๋ค.
โ๏ธ๋ง์ง๋ง์ finished[]= true ํด์ฃผ๋ ์ด์ โ๏ธ
dfs ์ธ์๋ฅผ ํฌํจํ ์ฌ์ดํด์ด ํ์ฑ๋๋ ์๋๋, dfs๋ฅผ ๋๊น์ง ์คํํ๋ฉฐ ์ฌ์ดํด์ ๋ง๋ฌ์ ๊ฒ์ด๋ค. ๋ชจ๋ ํ์์ด ํ๋ช ์ ๊ผญ ์ง๋ชฉํ๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ ์ ์์ ์์ํ๋ ์ฌ์ดํด์ ๋ง๋๊ณ ๋๋๋ค๋ ์ ์ ์๊ฐํด๋ณด๋ฉด ํจ์๊ฐ ๋๋๊ธฐ์ ์๋ ๋ฌด์กฐ๊ฑด ์ฌ์ดํด์ ํ์ฑํ๊ฑฐ๋ ์ด๋ฏธ ์์ฑ๋ ์ฌ์ดํด์ ๋ง๋ฌ์ ๊ฒ์ด๊ณ , ํ์ฌ dfs ์ธ์๋ฅผ ๊ฐ๋ฆฌํค๋ ํ์์ด dfs๋ฅผ ์์ํ ๋ finished ๋ฐฐ์ด์ด true ๋ผ๋ฉด ํด๋น ํ์์ ์ ์ธํ ์ฌ์ดํด์ด ์ด๋ฏธ ํ์ฑ ๋์๋ค๊ณ ํ๋จํ ์ ์์ผ๋ฏ๋ก finished๋ฅผ ๋ง์ง๋ง์ ๊ผญ true๋ก ๋ฐ๊ฟ์ค๋ค.
3->4->5->3 : ์ฌ์ดํด ํ์ฑ -> finished[true]
2->3->4->5->3 : 3์ด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ผ finished ํ์ธ. true๋ผ๋ฉด 2๋ฅผ ์ ์ธํ ์ฌ์ดํด ์ด๋ฏธ ์กด์ฌ. 2๋ ์ฌ์ดํด์ ์ด๋ฃฐ ์ ์๋ค. -> finished[true]
1->2->3->4->5->3 : 2์ด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๋
ธ๋๋ผ finished ํ์ธ. true๋ผ๋ฉด 1์ ์ ์ธํ ์ฌ์ดํด ์ด๋ฏธ ์กด์ฌ. 1์ ์ฌ์ดํด์ ์ด๋ฃฐ ์ ์๋ค -> finished[true]
โ๏ธcnt + 1 ํด์ฃผ๋ ์ด์ โ๏ธ
โ๏ธ์์ Input์ ๋ฃ์์ ๋์ ์ฝ๋ ์๋ โ๏ธ
์ฝ๋
int arr[100001];
bool visited[100001];
bool finished[100001];
int cnt;
void dfs(int cur){
visited[cur]= true;
int next = arr[cur];
if(!visited[next]){ // ์์ง ํ์ํ์ง ๋ชปํ ๋
ธ๋์ ๊ฒฝ์ฐ
dfs(next); // ๋ ์งํํด๋ณธ๋ค
}
else{ // ์ฌ์ดํด์ด๊ฑฐ๋, dfs ๋๊น์ง ๊ฐ์ ์ฌ์ดํด ํ๋จ์ด ๋๋ ๊ฒฝ์ฐ
if(!finished[next]){ // ์๋ก์ด ์ฌ์ดํด์ด ์๊ธฐ๋ ๊ฒฝ์ฐ
for(int i=next;i != cur ; i=arr[i]){
cnt++;
}
cnt ++; // ์ฌ์ดํด์ ๋ง์ง๋ง ๋
ธ๋๋ ํฌํจ์ด ์๋๋ฏ๋ก +1
}
}
finished[cur]=true; // ์ฌ์ดํด ํ๋จ์ด ๋๋จ(์ด ๋
ธ๋์ ์ฐ๊ฒฐ๋๋ ๋
ธ๋๋ ์ฌ์ดํด ํ์ฑ ๋ชปํจ)
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
for(int test=0;test<t;test++){
int n;
cin >> n;
for(int i=1;i<=n;i++){ //1๋ฒ๋ถํฐ n๋ฒ๊น์ง
cin >> arr[i];
}
memset(visited, false, sizeof(visited));
memset(finished, false, sizeof(finished));
cnt = 0; // ํ์ ํ์ฑํ ํ์๋ค
for(int i=1;i<=n;i++){
if(!visited[i]) dfs(i);
}
cout << n - cnt<< "\n"; // ์ด ํ์ - ํ ๊ตฌ์ฑ๋ ํ์ ์ = ํ ๋ชป ๊ตฌํ ํ์ ์
}
}