Doby's Lab

[알고리즘] 백준 10451번: 순열 사이클 (C++) 본문

PS/BOJ

[알고리즘] 백준 10451번: 순열 사이클 (C++)

도비(Doby) 2021. 11. 26. 14:51

https://www.acmicpc.net/problem/10451

 

10451번: 순열 사이클

1부터 N까지 정수 N개로 이루어진 순열을 나타내는 방법은 여러 가지가 있다. 예를 들어, 8개의 수로 이루어진 순열 (3, 2, 7, 8, 1, 4, 5, 6)을 배열을 이용해 표현하면 \(\begin{pmatrix} 1 & 2 &3&4&5&6&7&8 \\  3

www.acmicpc.net

바로 직전에 사이클을 문제를 풀어서 그런지 쉽게 재귀를 통해 풀 수 있었다.

  1. 방문하지 않았던 노드들을 탐색하기 시작한다.
  2. 방문하지 않은 노드로 탐색을 시작하면 바로 해당 노드의 방문을 체크한다.
  3. 해당 노드가 가리키는 노드가 방문하지 않았으면 재귀를 통해 다음 노드로 간다.
  4. 만약 가리키는 노드가 방문이 되어있으면 사이클이라는 뜻이므로 사이클의 개수 값을 더한다.
#include <iostream>
#define MAX 1000 + 1
using namespace std;

int arr[MAX];
bool visited[MAX];
int result;

void backTrack(int node) {
	visited[node] = 1;
	int next = arr[node];

	if (!visited[next]) {
		backTrack(next);
	}
	else {
		result++;
	}
}

void reset(int value) {
	for (int i = 1; i <= value; i++) {
		visited[i] = 0;
	}
}

int main() {
	int T;
	cin >> T;
	for (int t = 1; t <= T; t++) {
		int n;
		cin >> n;
		result = 0;

		for (int i = 1; i <= n; i++) {
			cin >> arr[i];
		}

		for (int i = 1; i <= n; i++) {
			if (!visited[i]) {
				backTrack(i);
			}
		}

		cout << result << '\n';
		reset(n);
	}
	return 0;
}
728x90