1부터 N까지의 수로 이루어진 순열이 있다. 이때, 사전순으로 다음에 오는 순열을 구하는 프로그램을 작성하시오.
사전 순으로 가장 앞서는 순열은 오름차순으로 이루어진 순열이고, 가장 마지막에 오는 순열은 내림차순으로 이루어진 순열이다.
N = 3인 경우에 사전순으로 순열을 나열하면 다음과 같다.
1, 2, 3
1, 3, 2
2, 1, 3
2, 3, 1
3, 1, 2
3, 2, 1
첫째 줄에 N(1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄에 순열이 주어진다.
첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다.
4
1 2 3 4
1 2 4 3
const fs = require('fs');
let [N, sequence] = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');
N = Number(N);
sequence = sequence.trim().split(' ').map(Number);
let sort = [...sequence].sort((a, b) => b - a);
let answer = [];
let tail = [];
if (sequence.every((value, index) => value === sort[index])) {
console.log(-1);
} else {
let i = N - 2;
while (sequence[i] > sequence[i + 1]) i--;
let j = N - 1;
while (sequence[i] > sequence[j]) j--;
[sequence[i], sequence[j]] = [sequence[j], sequence[i]];
answer = sequence.slice(0, i + 1);
tail = sequence.slice(i + 1).sort((a, b) => a - b);
answer = answer.concat(tail);
console.log(answer.join(' '));
}
이전에 이런 문제 풀었던 것 같은데 풀이 방법이 찔끔만 기억났다... 벌써 풀이 방법을 까먹은 듯하다.... 이러면 안 되는데ㅠ