Posts [BOJ] #10451 순열 사이클
[BOJ] #10451 순열 사이클
Cancel

[BOJ] #10451 순열 사이클

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 순열의 크기 N (2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 순열이 주어지며, 각 정수는 공백으로 구분되어 있다.

출력

각 테스트 케이스마다, 입력으로 주어진 순열에 존재하는 순열 사이클의 개수를 출력한다.

예제 입력

1
2
3
4
5
2
8
3 2 7 8 1 4 5 6
10
2 1 3 4 5 6 7 9 10 8

예제 출력

1
2
3
7

풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/* Date: 2020-08-29 */
#include <iostream>
#include <string.h>

using namespace std;

int Map[1001];
int is_visit[1001];
int T, N, Rst;

void init();
void dfs(int curr, int start);

int main(){
    cin >> T;
    for(int tc = 0; tc < T; tc++){
        init();
        for(int i = 1; i <= N; i++){
            dfs(i, i);
        }
        cout << Rst << endl;
    }
}

void init(){
    memset(is_visit, 0, sizeof(is_visit));
    memset(Map, 0, sizeof(Map));
    Rst = 0;
    cin >> N;
    for(int i = 1; i <= N; i++){
        cin >> Map[i];
    }
}

void dfs(int curr, int start){
    if(is_visit[curr]){
        return;
    }
    is_visit[curr] = 1;
    int next = Map[curr];
    if(next == start){
        Rst++;
        return;
    }
    dfs(next, start);
}

예전 코드를 보니 정말 어렵게 풀었더라.
이번에는 DFS를 통해 문제를 풀기 적합하게 코드를 구상할 수 있었던 것 같다.

This post is licensed under CC BY 4.0 by the author.

Contents