728x90
시간 제한 : 1초
메모리 제한 : 256MB
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 순열의 크기 N (2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 순열이 주어지며, 각 정수는 공백으로 구분되어 있다.
출력
각 테스트 케이스마다, 입력으로 주어진 순열에 존재하는 순열 사이클의 개수를 출력한다.
소스코드
#include <iostream> #include <vector> using namespace std; vector<int> arr; vector<bool> check; void sequence(int idx) { if (check[idx] == false) { check[idx] = true; sequence(arr[idx]); } else return; } int main(void) { int T; cin >> T; while (T--) { int N, cycle = 0; cin >> N; arr = vector<int>(N + 1, 0); check = vector<bool>(N + 1, false); for (int i = 1; i <= N; i++) cin >> arr[i]; for (int i = 1; i <= N; i++) { if (check[i] == false) { cycle++; sequence(i); } } cout << cycle << '\n'; } }
Tip
수 하나가 다른 수 하나만 가리키기 때문에, 이미 거쳐간 숫자인지만 체크하면 되는 문제다.
728x90
'Computer Science > Algorithm Problem' 카테고리의 다른 글
백준] 5556 - 타일(일본정보올림피아드 2011;JOI 2011) (0) | 2019.03.24 |
---|---|
백준] 2225 - 합분해 (0) | 2019.03.18 |
백준] 1406 - 에디터(CHCI 2004) (0) | 2019.03.13 |
백준] 14582 - 오늘도 졌다(2017 고려대학교 프로그래밍 대회) (0) | 2019.03.12 |
백준] 2721 - 삼각수의 합(ACM-ICPC Regionals) (0) | 2019.03.11 |