-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMain.java
More file actions
71 lines (57 loc) · 1.98 KB
/
Main.java
File metadata and controls
71 lines (57 loc) · 1.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int N;
static int[] num;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
num = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
int idx = 0;
while (st.hasMoreTokens()) {
num[idx] += Integer.parseInt(st.nextToken());
idx++;
}
// 5 4 3 2 1
//0
//
if (perm()) {
for (int i = 0; i < N; i++) {
System.out.print(num[i]+" ");
}
}else {
System.out.println(-1);
}
}
private static boolean perm() {
//먼저 배열의 뒤 부터 두개씩 비교하여 앞부분의 숫자가 더 큰 경우가 있는 인덱스를 찾는다.
//없는 경우 -1를 출력하고 종료한다.
int i = N - 1;
while (i > 0 && num[i - 1] <= num[i]) i--;
if (i <= 0) return false;
//i-1를 이후로 경계로 두어 배열의 뒤에서 부터 i-1과 비교하여 i-1보다 작은 값을 찾는다.
//예 3 4 | 1 2 5 로 나뉘고 뒤부터 앞의 경계값인 4와 비교한다.
int j = N - 1;
while (j > 0 && num[i - 1] <= num[j]) j--;
//i-1자리와 j를 스왑하여 위치 바꾼다.
//예 3 2 1 4 5
int tmp = num[i - 1];
num[i - 1] = num[j];
num[j] = tmp;
//i -1 자리 이후 내림 차순으로 정렬이 필요한 경우
//i-1 이후 i~N-1 자리까지 내림 차순으로 정렬 한다.
// 3 2 | 1 4 5 => 3 2 5 4 1
j = N - 1;
while (i < j) {
tmp = num[i];
num[i] = num[j];
num[j] = tmp;
i += 1;
j -= 1;
}
return true;
}
}