Algorithm/Algorithm

순열 활용하기

lee308812 2019. 9. 13. 12:01

 

예제 입력 1

4

1 2 3 4

예제 출력 1

1 2 4 3

예제 입력 2

5

5 4 3 2 1

예제 출력 2

-1

 

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

 

10972번: 다음 순열

첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다.

www.acmicpc.net

#include <stdio.h>
#define MAX_SIZE (10001)

int N;
int arr[MAX_SIZE];

void swap(int* ar, int a, int b)
{
	int temp = ar[a];
	ar[a] = ar[b];
	ar[b] = temp;
}


// 1. A[i-1] < A[i]를 만족하는 가장 큰 i를 찾는다.
// 2. j >= i 이면서 A[j] > A[i-1]를 만족하는 가장 큰 j를 찾는다.
// 3. A[i-1]과 A[j]를 swap한다.
// 4. A[i]부터 순열을 뒤집는다.
bool next_permutation(int* a, int n)
{
	int i = n - 1;
	while ((i > 0) && (a[i - 1] > a[i])) i--;

	if (i <= 0) return false;

	int j = n - 1;
	while ((i <= j) && (a[i - 1] > a[j])) j--;

	swap(a, i - 1, j);
	
	j = n - 1;
	while (i < j)
	{
		swap(a, i, j);
		i++; j--;
	}

	return true;
}

int main(void)
{
	scanf("%d", &N);
	
	for (register int i = 0; i < N; i++)
		scanf("%d", &arr[i]);

	if (next_permutation(arr, N))
	{
		for (register int i = 0; i < N; i++)
			printf("%d ", arr[i]);

		printf("\n");
	}
	else
		printf("-1\n");

	return 0;
}

'Algorithm > Algorithm' 카테고리의 다른 글

[재귀] N과 M(2)  (0) 2019.10.28
[재귀] N과 M(1)  (0) 2019.10.28
조합 활용하기  (0) 2019.09.13
파스칼의 삼각형  (0) 2018.10.01
[그래프] 인접 리스트  (0) 2018.08.21