[알고리즘] next permutation

ERror.ASER·2021년 3월 15일
0

알고리즘

목록 보기
4/5

Next Permtation

nPn에서 적용 가능하지만, nPr은 불가능하다!!!

package boj;

import java.util.Arrays;
import java.util.Scanner;

public class nextPermutation {
	static int N;
	static int[] input;
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		N = sc.nextInt();
		input = new int[N];
		
		for(int i=0; i<N; i++) {
			input[i] = sc.nextInt();
		}
		Arrays.sort(input);//오름차순 정렬하여 가장 작은 순열의 상태로 만듦
		
		do {
			System.out.println(Arrays.toString(input));
		}while(np());
		
	}
	
	
	//NPN, n개중에 r 뽑는 순열은 안된다.
	public static boolean np() {
		
		//STEP 1 : 꼭대기를 찾기 위해 맨 뒤부터!
		int i = N-1;//맨뒤부터 쓴다.
		while(i>0 && input[i-1]>= input[i]) --i; //인접한 두 요소 비교
		
		//더이상 앞자리가 없는 상황 : 현 순열의 상태가 가장 큰 수열(마지막 순열)
		if(i==0) return false;
		
		//STEP 2 : 꺾어지는 곳 교환해야해!
		int j = N-1;
		while(input[i-1] >= input[j]) --j;//교환위치(i-1)와 교환 위치보다 큰수인지 비교한다.
		
		//STEP 3
		swap(i-1,j);
		
		//STEP 4
		int k= N-1;
		while(i<k) {
			swap(i++,k--);
		}
		return true;
	}
	
	private static void swap(int i, int j) {
		int temp = input[i];
		input[i] = input[j];
		input[j] = temp;
	}

}
profile
지우의 블로그

0개의 댓글