본문 바로가기
언어/JAVA

다음 순열(Next Permutation)을 활용한 조합 생성

by 김어찐 2021. 8. 12.
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