어제 풀었던 다음 순열의 쌍둥이 문제. 로직은 부등호 방향만 바꿔주면 된다.
v[i-1] > v[i]
를 만족하는 가장 큰i
를 찾는다.j >= i
이면서v[j] < v[i-1]
를 만족하는 가장 큰j
를 찾는다.v[i-1]
와v[j]
를 swap한다.v[i]
부터 끝까지 배열을 뒤집는다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v;
int N;
bool go() {
int i, j;
i = N - 1;
while (i && v[i - 1] <= v[i]) i--;
if (i <= 0) return false;
j = N - 1;
while (v[j] >= v[i - 1]) j--;
swap(v[i - 1], v[j]);
j = N - 1;
while (i < j) {
swap(v[i], v[j]);
i++;
j--;
}
return true;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int i, tmp;
cin >> N;
for (i = 0; i < N; i++) {
cin >> tmp;
v.push_back(tmp);
}
if (go()) {
for (i = 0; i < N; i++) cout << v[i] << " ";
}
else cout << "-1";
cout << endl;
return 0;
}