10972_다음 순열
10972번: 다음 순열
첫째 줄에 입력으로 주어진 순열의 다음에 오는 순열을 출력한다. 만약, 사전순으로 마지막에 오는 순열인 경우에는 -1을 출력한다.
www.acmicpc.net
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
int[] num = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++){
num[i] = Integer.parseInt(st.nextToken());
}
boolean flag = false;
Loop:
for(int i=n-1; i>=1; i--){
if(num[i-1]<num[i]){
flag = true;
for(int j=n-1; j>=i; j--){
if(num[i-1]<num[j]){
int temp = num[i-1];
num[i-1] = num[j];
num[j] = temp;
Arrays.sort(num, i, n);
break Loop;
}
}
}
}
if(!flag)
sb.append(-1);
else{
for(int i=0; i<n; i++){
sb.append(num[i]).append(" ");
}
}
System.out.print(sb);
br.close();
}
}
예) 6 2 4 5 3 1 일때
① 오른쪽부터 num[i-1]<num[i] 인 수 찾기 : 6 2 4 5 3 1
② i+1 ~ n-1 까지 (i로부터 오른쪽) 범위에서 2보다 큰 첫 번째 수 찾기 : 6 2 4 5 3 1
③ swap : 6 2 4 5 3 1 -> 6 3 4 5 2 1
④ i+1 ~ n-1 까지 범위의 수 오름차순 정렬 : 6 3 1 2 4 5 = 다음 순열
- 위의 과정을 행하지 않을 경우 : flag=false -> -1 출력
행한 경우 : flag=true -> num[] 출력
10973_이전 순열
10973번: 이전 순열
첫째 줄에 입력으로 주어진 순열의 이전에 오는 순열을 출력한다. 만약, 사전순으로 가장 처음에 오는 순열인 경우에는 -1을 출력한다.
www.acmicpc.net
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
int[] num = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++){
num[i] = Integer.parseInt(st.nextToken());
}
boolean flag = false;
Loop:
for(int i=n-1; i>=1; i--){
if(num[i-1]>num[i]){
flag = true;
for(int j=n-1; j>=i; j--){
if(num[i-1]>num[j]){
int temp = num[i-1];
num[i-1] = num[j];
num[j] = temp;
int k = n-1;
while(i<k){
int temp1 = num[i];
num[i] = num[k];
num[k] = temp1;
i++; k--;
}
break Loop;
}
}
}
}
if(!flag)
sb.append(-1);
else{
for(int i=0; i<n; i++){
sb.append(num[i]).append(" ");
}
}
System.out.print(sb);
br.close();
}
}
예) 6 2 4 5 1 3 일때
① 오른쪽부터 num[i-1]>num[i] 인 수 찾기 : 6 2 4 5 1 3
② i+1 ~ n-1 까지 (i로부터 오른쪽) 범위에서 5보다 작은 첫 번째 수 찾기 : 6 2 4 5 1 3
③ swap : 6 2 4 5 1 3 -> 6 2 4 3 1 5
④ i+1 ~ n-1 까지 범위의 수 내림차순 정렬 : 6 2 4 3 5 1 = 이전 순열
- 위의 과정을 행하지 않을 경우 : flag=false -> -1 출력
행한 경우 : flag=true -> num[] 출력
'1d-1c > BOJ' 카테고리의 다른 글
6603_로또 (JAVA) (0) | 2020.11.28 |
---|---|
11723_집합 (JAVA) (0) | 2020.11.25 |
9095_1,2,3 더하기 (JAVA) (0) | 2020.11.24 |
14500_테트로미노 (JAVA) (0) | 2020.11.23 |
6588_골드바흐의 추측 (JAVA) (0) | 2020.11.22 |