10973 이전 순열 java

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class B10973 {

	public static void main(String[] args) throws NumberFormatException,IOException{
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(br.readLine());
		//수열 15432 입력하기 
		int arr[] = new int[N];
		StringTokenizer st = new StringTokenizer(br.readLine());
		for(int i = 0 ; i <N ;i++) {
			arr[i]= Integer.parseInt(st.nextToken());
			
		}
		if(cal(arr)) {
			for(int i = 0 ;i < N ;i++) {
				System.out.print(arr[i]+"");
			}
			System.out.println();
		} else {
			System.out.println("-1");
		}	
	}
	public static boolean cal(int arr[]) {
		int a = arr.length-1;
		while(a>0&&arr[a-1]<=arr[a]) a--;
		if(a<=0) return false; // a가 0이하가 될떄까지 반복문을 돌린다 , 즉 수열이 오름차순일떄 false를 리턴함 
		
		//a가 0까지 줄어들지 않아서 false가 리턴되지 않고 여기까지 진행된다면 여기에서 순서가 꼬인 부분을 찾을 수 있음 
		int b = arr.length-1; // 다시 위의 과정 반복 
		while(arr[a-1]<=arr[b]) b--; // 수열 21345 에서 여기에서 a은1이고  b=2일떄는 반복문이 돌지않아 b가 감소하지 않는다.
		// 즉 인덱스 b가 2일때, 그때의 배열값부터 마지막 배열까지는 오름차순을 만족한다 
		
		int tmp = arr[a-1];
		arr[a-1]=arr[b];
		arr[b]= tmp;
		
		
		// 인덱스 a부터 인덱스 마지막까지의 배열값을 내림차순으로 정렬한다 
		int start =a;
		int end =arr.length-1;
		while(start<end) {
			tmp = arr[start];
			arr[start] =arr[end];
			arr[end] = tmp;
			start++;
			end--;
		}
		return true;
	}
	//수열 51234 등으로 확인해보기  (a=2,b=4)
	// a = 베열값 오름차순이 시작되는 인덱스 
	// a-1 = 배열값 오름차순이 시작되기 직전의 인덱스 
	// b= 인덱스 a-1일때의 배열값보다 작으면서 오름차순이 끝나는 구간 

}

좋은 웹페이지 즐겨찾기