코딩/알고리즘
[알고리즘] 백준 이전 순열 10973번
유어노우
2021. 1. 18. 00:01
2021/01/17 - [코딩/알고리즘] - [알고리즘] 백준 다음 순열 10972번 JAVA
[알고리즘] 백준 다음 순열 10972번 JAVA
2021/01/06 - [코딩/알고리즘] - [알고리즘] 백준 테트로미노 14500번 JAVA [알고리즘] 백준 테트로미노 14500번 JAVA 2021/01/06 - [코딩/알고리즘] - [알고리즘] 백준 날짜 계산 1476번 JAVA [알고리즘] 백준 날..
yourknow.tistory.com
10973번: 이전 순열
첫째 줄에 입력으로 주어진 순열의 이전에 오는 순열을 출력한다. 만약, 사전순으로 가장 처음에 오는 순열인 경우에는 -1을 출력한다.
www.acmicpc.net
다음 순열 문제를 풀었다면 쉽게 풀 수 있는 문제
arry[i] 와 arry[i-1]의 부등호를 바꾸고
마지막에 내림차순으로 정렬
import java.util.Scanner;
public class Main_10973 {
public static int N;
public static int arry[];
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
N=scanner.nextInt();
arry = new int[N];
for(int i=0; i<N; i++){
arry[i] = scanner.nextInt();
}
scanner.close();
if(sol()) output();
else System.out.println("-1");
}
public static boolean sol() {
for(int i=N-1; i>=1; i--) {
if(arry[i] < arry[i-1]) {
//arry[i-1] 이후 값 중 arry[i-1]이전 숫 찾는다.
int num =fMin(arry,i-1,N-1);
System.out.println(num);
//num==0이면 이미 내림차순으로 정렬되어있다는
if(num==0) break;
//찾은 수의 인덱스를 찾고 arry[i-1]와 바꿔준다.
for(int j=i; j<N; j++) {
if(arry[j]==num){
int temp = arry[j];
arry[j] = arry[i-1];
arry[i-1] = temp;
}
}
sort_part(arry,i,N-1,false); //true:내림차순 false:오름차순
return true;
}
}
return false;
}
public static int fMin(int arry2[], int start,int end) {
int num=arry2[start];
sort_part(arry2,start,end,true);
for(int i=start; i<=end;i++){
if(arry2[i]==num) {
return arry2[i-1];
}
}
return 0;
}
//결과출력
public static void output(){
for(int i=0; i<N; i++){
System.out.print(arry[i]+" ");
if(i == N-1) System.out.println("");
}
}
//배열의 일부분을 버블소트로 오름 차순 정렬
public static void sort_part(int ary[], int start, int end,boolean option) {
for (int i=start; i<end;i++) {
for(int j=i+1; j<=end;j++) {
if(option) {
if(ary[i] > ary[j]) {
int temp=ary[i];
ary[i]=ary[j];
ary[j]=temp;
}
}
else {
if(ary[i] < ary[j]) {
int temp=ary[i];
ary[i]=ary[j];
ary[j]=temp;
}
}