728x90

문제


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

 

10973번: 이전 순열

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

www.acmicpc.net

 

코드


//실버3 이전 순열
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\r\n");

const N = Number(input[0]);
let numbers = [];
for (let i = 1; i <= N; i++) numbers.push(i); //1~N까지의 수를 numbers에 담기
let next = input[1].split(" ").map((i) => Number(i)); //입력으로 받는 순열을 number화 하여 next 배열에 저장

let sortNumbers = [...numbers].sort((a, b) => a - b); //numbers배열 오름차순 정렬
//next배열이 오름차순돼있다면 순열의 가장 처음 조합이므로 -1 출력
if (next.every((num, index) => num === sortNumbers[index])) console.log(-1);
else {
  //배열의 맨 뒤에서부터 내림차순이 깨지는 순간의 index (i) 구하기
  let i = N - 2;
  while (next[i] < next[i + 1]) i--;

  //next[i] 뒤의 수 중에서 next[i]보다 작은 수 중에서 가장 큰 값을 가지는 index (j) 구하기
  let j = N - 1;
  while (next[i] < next[j]) j--;

  //next[i]와 next[j] swap하기
  [next[i], next[j]] = [next[j], next[i]];

  let rest = next.slice(i + 1); //next[i] 뒤의 값들만 가지는 rest 배열 만들기
  rest.sort((a, b) => b - a); //next[i] 뒤의 값들은 내림차순 정렬
  let answer = [...next.slice(0, i + 1), ...rest]; //떼놨던 next[i]까지의 수와 rest합치기
  console.log(answer.join(" "));
}

 

후기


잘못된 내용이나 수정이 필요한 내용이 있으면 언제든 댓글 달아주세요 감사합니다 😀

+ Recent posts