👀 문제
https://www.acmicpc.net/problem/10972
👊 도전
1. 설계
- 인덱스 i로 배열을 역순 순회하며 a[i-1]< a[i]를 찾는다.
- 인덱스 j를 역순 순회하며 i<=j 중 a[i-1]< a[j]인 j를 찾는다.
- a[i-1]와 a[j]를 swap한다.
- a[i]부터 뒤집는다.
2. 구현 (성공 코드)
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
import java.util.Scanner;
/**
* @author HEESOO
*
*/
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan = new Scanner(System.in);
int n=scan.nextInt();
int[] array=new int[n];
boolean flag=false;
for(int i=0;i<n;i++)
array[i]=scan.nextInt();
for(int i=n-1;i>0;i--) {
if(array[i-1]<array[i]) {
for(int j=n-1;j>=i;j--) {
if(array[i-1]<array[j]) {
int temp=array[i-1];
array[i-1]=array[j];
array[j]=temp;
break;
}
}
int k=n-1;
while(i<k) {
int temp=array[i];
array[i]=array[k];
array[k]=temp;
i++;
k--;
}
flag=true;
break;
}
}
if(!flag)
System.out.println("-1");
else
for(int i=0;i<n;i++)
System.out.print(array[i]+" ");
}
}
3. 결과
🤟 성공 🤟
4. 설명
- 규칙을 찾아낸다
- 인덱스 i를 역순 순회하며 a[i-1]< a[i]인 i를 찾는다.
- 인덱스 j역시 역순 순회하며 a[i-1]< a[j]인 j를 찾는다. i<=j까지만 체크한다.
- a[i-1]와 a[j]를 swap한다.
- a[i]부터 원소들을 뒤집는다.
- 위 과정을 진행했다면 입력받은 배열은 역순이 아니므로 flag를 통해 표시한다.
- 2중for문을 탈출한 후 flag를 체크하여 입력받은 배열이 변경되었는지 확인한다.
- 변경되지 않았다면 입력 배열이 역순이므로 -1을 리턴, 아니라면 바뀐 배열을 출력한다.
👏 해결 완료!
참고
- [Java]백준 10972번 :: 다음 순열 https://developer-mac.tistory.com/57