
https://www.acmicpc.net/problem/10972
결국 n!-1번째까지 조합을 검사해야 되는데 어떻게 그걸 검사할지가 관건이다.
알고 보니까 다음 순열을 찾는데 적합한 next permutation 알고리즘이 있었다!
(1번에서 앞까지 쭉 탐색했는데도 i < i+1인 i가 존재하지 않으면 주어진 순열이 최대 순열인 것이므로 다음 순열이 존재하지 않음 ➡︎ -1 출력하고 끝냄)
(오름차순 정렬이 아니라 그냥 순서를 반전해 뒤집어 정렬)
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
scanf("%d", &n);
int *nums = (int *)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++)
scanf("%d", &nums[i]);
int p = -1;
for (int i = n - 2; i >= 0; i--) {
if (nums[i] < nums[i + 1]) {
p = i;
break;
}
}
if (p == -1)
printf("-1\n");
else {
int next = -1;
for (int i = n - 1; i > p; i--) {
if (nums[i] > nums[p]) {
next = i;
break;
}
}
int temp = nums[p];
nums[p] = nums[next];
nums[next] = temp;
int start = p + 1;
int end = n - 1;
while (start < end) {
temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
for (int i = 0; i < n; i++)
printf("%d ", nums[i]);
printf("\n");
}
free(nums);
return 0;
}
기억할 것: 두 요소를 배열 뒤에서부터 비교할 때에는 인덱스를 n-2부터 시작해도 된다! 두 개씩 비교하니까 n-1부터 시작하는 게 의미가 없음...