문제
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을 출력한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class baekjoon10973 {
private static int[] info;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int num = Integer.parseInt(br.readLine());
info = new int[num];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < num; i++) {
info[i] = Integer.parseInt(st.nextToken());
}
if (num == 1) {
System.out.println(-1);
System.exit(0);
}
int endIndex = num - 1;
while (endIndex != 0 && info[endIndex - 1] < info[endIndex]) {
endIndex--;
}
if (endIndex == 0) {
System.out.println(-1);
System.exit(0);
}
int tempIndex = endIndex;
int temp = info[tempIndex];
for (int i = endIndex + 1; i < num; i++) {
if (info[i] < info[endIndex - 1] && info[i] > temp) {
tempIndex = i;
temp = info[i];
}
}
info[tempIndex] = info[endIndex - 1];
info[endIndex - 1] = temp;
for (int i = 0; i < endIndex; i++) {
System.out.print(info[i] + " ");
}
for (int i = num - 1; i >= endIndex; i--) {
System.out.print(info[i] + " ");
}
System.out.println();
}
}
'알고리즘 > 초급1' 카테고리의 다른 글
[JAVA] 백준 10819번: 차이를 최대로 ( 초급 2-23 ) - hard (0) | 2021.09.29 |
---|---|
[JAVA] 백준 10974번: 모든 순열 ( 2-22 ) (0) | 2021.09.27 |
[JAVA] 백준 10972번: 다음 순열 ( 초급 2-20 ) - hard (0) | 2021.09.27 |
[JAVA] 백준 15666번: N과 M (12) ( 초급 2-19 ) (0) | 2021.09.25 |
[JAVA] 백준 15665번: N과 M (11) ( 초급 2-18 ) (0) | 2021.09.25 |