BOJ_10972_다음 순열
2021. 9. 28. 22:49ㆍ백준 알고리즘(BOJ)
1
구분: 수학, 조합론
언어: Java
전략:
next permutation을 이용하는 문제이다
NEXT PERMUTATION - 한 순열에서 사전 순으로 다음 순열 생성
1. 배열을 오름차순으로 정렬한 후 시작한다.
2. 맨 뒤부터 탐색하여 꼭대기(가장 큰 수, i번째)를 찾는다.
3. 꼭대기 바로 앞(i-1번째)보다 큰 수를 맨 뒤에서 부터 찾는다.(j)
4. i-1과 j를 교환한다.
5. 꼭대기 위치부터 맨 뒤까지 오름차순 정렬을 한다.
6. 2~5번 과정을 반복한다.
2. 코드
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n];
for(int i = 0; i<n; i++) {
arr[i] = scanner.nextInt();
}
if(np(arr)) {
for(int i : arr) {
System.out.print(i+" ");
}
}
else {
System.out.println(-1);
}
}//main
private static boolean np(int[] arr) {
int n = arr.length;
int i = n-1;
//꼭대기를 찾는다. - i는 꼭대기, i-1이 교환위치
while(i>0 && arr[i-1]>arr[i])--i;
//맨 마지막이면
if(i == 0)
return false;
int j = n-1;
//맨 뒤에서부터 i-1보다 큰 거 찾는다 -> 변경할 것
while(arr[j]<arr[i-1])--j;
swap(arr, j, i-1);
int k = n-1;
//꼭대기부터 끝까지 오름차순 정렬
while(i<k) {
swap(arr, i++, k--);
}
return true;
}//np
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
3.
- next permutation을 연습할 수 있는 가장 기본 문제이다.
- 처음에는 순열을 다 만들어 비교하는 방식으로 했으나 잘 문제가 풀리지 않았다.
'백준 알고리즘(BOJ)' 카테고리의 다른 글
BOJ_17144_미세먼지 안녕! (0) | 2021.10.21 |
---|---|
BOJ_14502_연구소 (0) | 2021.09.29 |
BOJ_12865_평범한 배낭 (0) | 2021.09.27 |
BOJ_17472_다리 만들기2 (0) | 2021.09.24 |
BOJ_17471_게리맨더링 (0) | 2021.09.24 |