728x90
public class CombNextPermutationTest {
public static void main(String[] args) {
int[] input = {7,1,4,2,3};
int N = input.length;
int R = 4;
int[] p = new int[N];
// 뒤쪽부터 R개만큼 1채우기
int cnt = 0;
while(++cnt<=R) p[N-cnt]=1;
do {
for(int i = 0 ; i<N ;i++)
{
if(p[i]==1)
{
System.out.print(input[i]+" ");
}
}
System.out.println();
}while(np(p));
}
// 다음 큰 순열이 있으면 true, 없으면 false
private static boolean np(int[] numbers)
{
int N = numbers.length;
// step1 꼭대기(i)를 찾는다. 꼭대기를 통해 교환 위치(i-1) 찾기
int i=N-1;
while(i>0 && numbers[i-1]>=numbers[i])
{
--i;
}
if(i==0) return false;
// setp2 i-1 위치값과 교환할 큰 값 찾기
int j = N-1;
while(numbers[i-1]>=numbers[j])
{
--j;
}
// step3 i-1 위치값과 j 위치값 교환
swap(numbers,i-1,j);
// step4 꼭대기부터 맨 뒤 까지 내림차순형태의 오름차순으로 처리
int k = N-1;
while(i<k)
{
swap(numbers,i++,k--);
}
return true;
}
private static void swap(int[] numbers,int i , int j)
{
int temp = numbers[i];
numbers[i] = numbers[j];
numbers[j]=temp;
}
}
728x90
'언어 > JAVA' 카테고리의 다른 글
자바 컬렉션 배열 사용하기 (0) | 2021.08.25 |
---|---|
PrioryityQueue(우선순위 큐) (0) | 2021.08.24 |
다음 순열 (Next Permutation) (0) | 2021.08.12 |
2차원 배열 회전 (시계 , 반 시계) (0) | 2021.08.12 |
링크드 리스트 구현 (0) | 2021.08.09 |