[알고리즘 설계] 자바를 이용한 next_permutation 구현

C++에는 STL에 다음 순열을 탐색해주는 next_permutation 함수가 구현되어 있다.

안타깝게도 자바는 next_permutation 함수를 직접 구현해야해서, 이 코드를 정리해둔다.

이를 통해 전체 순열을 탐색하는 알고리즘을 작성할 수 있다.

아래와 같이 네가지 단계를 기억해야 한다.

첫 번째 단계로는 맨 뒤에서부터 탐색하며, 교환할 위치를 찾아야 한다.

뒤쪽부터 탐색하며, i보다 값이 작은 i-1 인덱스를 발견하는 순간이 교환할 위치 i-1이 된다.

두 번째 단계로는 내가 찾은 i-1인덱스의 배열 값과, 교환할 i-1보다 큰 위치 j를 찾는 것이다.

이렇게 찾은 i-1자리와 j의 값을 교환한다.

마지막으로는, 다음 순열의 사전순의 특징을 위해 i번째 인덱스부터 맨마지막 인덱스의 배열 값을 오름차순으로 바꿔주는 작업이 필요하다.

boolean nextPermutation(int[] arr) {
	total++;
	// step1
	int i=N-1;
	while( i>0 && arr[i-1] >= arr[i] ) --i; 
	
    //i가 0이라는 말은 이 순열이 내림차순 형태로 정렬되어 있다는 것.
    //다음 순열이 없는 경우이기 때문에 false를 반환해준다.
	if(i==0) return false;
	
	//step2
    //내가 찾은 교환위치와 교환할 큰 값을 찾는 과정이다.
	int j = N-1;
	while(arr[i-1]>=arr[j]) --j;
	
	//step3
    //j와 i-1번째의 배열 값을 서로 교환해준다.
	int temp = input[i-1];
	input[i-1] = input[j];
	input[j] = temp;
	
	//step4
    //i부터 맨뒤에까지를 오름차순으로 교환해준다.
	int k = N-1;
	while(i<k) {
	    temp=input[i];
		input[i]=input[k];
		input[k]=temp;
		++i; --k;
	}
	return true;		
}

참고

(www.nayuki.io/page/next-lexicographical-permutation-algorithm)[https://www.nayuki.io/pagenext-lexicographical-permutation-algorithm]

댓글남기기