Development Palette

[순열, 조합] NextPermutation 본문

Algorithm/개념

[순열, 조합] NextPermutation

징주 2021. 8. 18. 00:46

- 현 순열에서 사전 순으로 다음 순열 생성

- 자바는 네퍼의 API가 없으므로 직접 구현해야함..

- 네퍼로 순열을 생성하는 것을 응용하여 조합을 할 수 있다.

- 주의 : 네퍼 하기 전 오름차순 정렬 후, 가장 작은 순열을 먼저 처리 해야한다.

순열

package com.ssafy.w0812.permutation;

import java.util.Arrays;

public class NextPermutationTest {

	public static void main(String[] args) {

		int[] input = {7,1,4};
		
		Arrays.sort(input); // 가장 작은 순열 만들기 , 1,4,7
		
		do {
			// 순열 사용
			System.out.println(Arrays.toString(input));
			
		}while(np(input));
	}
	
	// 다음 큰 순열이 있으면 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;
		
		// step2. i-1 위치값과 교환할 큰 값 찾기
		int j = N-1;		
		while(numbers[i-1]>=numbers[j]) --j;
		
		// step3. i-1위치값과 j위치값 교환 
		swap(numbers,i-1,j);
		
		// step4. 꼭대기(i)부터 맨뒤 까지 내림차순형태의 순열을 오름차순으로 처리
		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;
	}
	

}

1 4 7

1 7 4

4 1 7

4 7 1

7 1 4

7 4 1

조합

package com.ssafy.w0812.combination;

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;
		
		// step2. i-1 위치값과 교환할 큰 값 찾기
		int j = N-1;		
		while(numbers[i-1]>=numbers[j]) --j;
		
		// step3. i-1위치값과 j위치값 교환 
		swap(numbers,i-1,j);
		
		// step4. 꼭대기(i)부터 맨뒤 까지 내림차순형태의 순열을 오름차순으로 처리
		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;
	}

}

1 4 2 3 
7 4 2 3 
7 1 2 3 
7 1 4 3 
7 1 4 2 

'Algorithm > 개념' 카테고리의 다른 글

BFS, DFS, Backtracking  (0) 2021.08.19
[순열] 비트마스크로 순열  (0) 2021.08.18
이진 검색  (0) 2021.08.18
분할 정복 기법  (0) 2021.08.18
그리디, 탐욕 알고리즘  (0) 2021.08.18
Comments