문제링크
https://www.acmicpc.net/problem/10972
import java.util.Scanner;
public class Main_10972 {
static int N;
static int numbers[];
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
numbers = new int[N];
for(int i=0;i<N;i++) {
numbers[i] = sc.nextInt();
}
if(np()) {
for(int i=0;i<N;i++)
System.out.print(numbers[i]+" ");
}
else
System.out.println(-1);
}
public static boolean np() {
int i = N-1;
while(i>0 && numbers[i-1]>=numbers[i]) --i;
if(i ==0) return false;
int j = N-1;
while(numbers[i-1]>=numbers[j]) --j; //꺽이는 값 찾은 후 제일 큰 값 찾기
swap(i-1,j);
int k = N-1;
while(i<k)
swap(i++,k--);
return true;
}
private static void swap(int i,int j) {
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
}
평소에 사용하던 대로 재귀를 사용해서 풀면 시간초과가 난다.
따라서 규칙을 찾아서 풀거나 해야한다. 나는 next permutation 으로 다음 순열을 찾는 것을 사용했다.
이 부분은 현재 순열의 맨 뒤에서 부터 탐색을 하면서 바로 직전이 나보다 크거나 같으면 올라가면서 꼭대기를 찾는 것이다.
만약 i ==0 이면 이미 순열의 맨 마지막에 도달한 것이니 false를 return 한다.
그리고 j를 통해서 꼭대기를 찾은 후 꼭대기 수 말고 제일 큰 수를 찾아준다 (swap하기 위해)
이렇게 swap을 한 후 정리해주면 된다. (내림차순을 오름차순으로)
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA]백준_1931_회의실 배정 (0) | 2021.02.17 |
---|---|
[JAVA]백준_2961_도영이가 만든 맛있는 음식 (1) | 2021.02.16 |
[JAVA]백준_10026_적록색약 (0) | 2021.02.15 |
[JAVA]백준_11723_집합 (0) | 2021.02.15 |
[JAVA]백준_3040_백설공주와 일곱난쟁이 (0) | 2021.02.15 |