https://www.acmicpc.net/problem/10972
Brute-force 방식으로, 백트래킹을 이용한 접근법을 생각해봤으나 N이 10,000까지 가능하므로 무조건 시간초과가 납니다.
입력 : 첫째 줄에 N(1 ≤ N ≤ 10,000)이 주어진다.
둘째 줄에 순열이 주어진다.
//
// main.cpp
// 10972
//
// Created by Jun Hyeok Kim on 5/13/24.
//
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
int arr[10000];
void doSomething() {
int idx=n;
for (int i=n-1; i>0; i--) {
if (arr[i] > arr[i-1]) {
idx=i;
break;
}
}
if (idx == n) {
cout << -1;
exit(0);
}
for (int i=n-1; i>= idx; i--) {
if (arr[i] > arr[idx-1]) {
swap(arr[i],arr[idx-1]);
break;
}
}
sort(arr+idx,arr+n);
}
int main() {
cin >> n;
for (int i=0; i<n; i++) {
cin >> arr[i];
}
doSomething();
for (int i=0; i<n; i++) {
cout << arr[i] << " ";
}
return 0;
}
N,M을 활용한 수열 백트래킹에 익숙해진 나머지 규칙을 찾아내기가 조금 까다로웠다..!