ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [BOJ] 다음 순열, 이전 순열
    Algorithm/BOJ 2020. 2. 3. 13:16

    순열(Permutation)

    • 크기가 N인 수열은 총 N!개가 존재한다.
    • 순열을 사전 순으로 나열했을 때, 첫 번째 순열은 오름차순, 마지막 순열은 내림차순이다.
    • N = 3인 경우에 사전순은 다음과 같다.
    • 123
    • 132
    • 213
    • 231
    • 312
    • 321

     

     

    [10972] 다음 순열

    https://www.acmicpc.net/problem/10972

     

    1. A[j-1] < A[i]를 만족하는 가장 큰 i를 찾는다.

     

    2. j >= i이면서 A[j] > A[i-1]를 만족하는 가장 큰 j를 찾는다.

     

    3. A[j-1]과 A[j]를 swap 한다.

     

    4. A[j]부터 순열을 뒤집는다.

     

     

    소스코드

     

    import java.util.Scanner;
    
    public class Main {
    
    	public void go() {
    		Scanner sc = new Scanner(System.in);
    		int n = sc.nextInt();
    		int[] a = new int[n];
    		for (int i = 0; i < n; i++) {
    			a[i] = sc.nextInt();
    		}
    
    		if (next_permutation(a, n))
    			print(a);
    		else
    			System.out.println(-1);
    	}
    
    	public boolean next_permutation(int[] a, int n) {
    		int i = n - 1;
    		while (i > 0 && a[i - 1] >= a[i]) {	// 1
    			i -= 1;
    		}
    		if (i <= 0)
    			return false;
    		int j = n - 1;
    		while (a[i - 1] >= a[j])	// 2
    			j -= 1;
    		swap(a, i - 1, j);	// 3
    		j = n - 1;
    		while (i < j) {	// 4
    			swap(a, i, j);
    			i += 1;
    			j -= 1;
    		}
    		return true;
    	}
    
    	public void swap(int[] a, int i, int j) {
    		int temp = a[i];
    		a[i] = a[j];
    		a[j] = temp;
    	}
    
    	public void print(int[] arr) {
    		for (int i = 0; i < arr.length; i++) {
    			System.out.print(arr[i] + " ");
    		}
    		System.out.println();
    	}
    
    	public static void main(String[] args) {
    		Main main = new Main();
    		main.go();
    	}
    }

     

     

    [10973] 이전 순열

    https://www.acmicpc.net/problem/10973

     

    소스 코드

     

    import java.util.Scanner;
    
    public class Main {
    
    	public void go() {
    		Scanner sc = new Scanner(System.in);
    		int n = sc.nextInt();
    		int[] a = new int[n];
    		for (int i = 0; i < n; i++) {
    			a[i] = sc.nextInt();
    		}
    
    		if (prev_permutation(a, n))
    			print(a);
    		else
    			System.out.println(-1);
    	}
    
    	public boolean prev_permutation(int[] a, int n) {
    		int i = n - 1;
    		while (i > 0 && a[i - 1] <= a[i]) {
    			i -= 1;
    		}
    		if (i <= 0)
    			return false;
    		int j = n - 1;
    		while (a[i - 1] <= a[j]) {
    			j -= 1;
    		}
    		swap(a, i - 1, j);
    		j = n - 1;
    		while (i < j) {
    			swap(a, i, j);
    			i += 1;
    			j -= 1;
    		}
    		return true;
    	}
    
    	public void swap(int[] a, int i, int j) {
    		int temp = a[i];
    		a[i] = a[j];
    		a[j] = temp;
    	}
    
    	public void print(int[] arr) {
    		for (int i = 0; i < arr.length; i++) {
    			System.out.print(arr[i] + " ");
    		}
    		System.out.println();
    	}
    
    	public static void main(String[] args) {
    		Main main = new Main();
    		main.go();
    	}
    }

     

     

     

    'Algorithm > BOJ' 카테고리의 다른 글

    [BOJ] 리모컨  (0) 2020.02.04
    [BOJ] 로또  (0) 2020.02.03
    [BOJ] 외판원 순회2  (0) 2020.02.03
    [BOJ] 차이를 최대로  (0) 2020.02.03
    [BOJ] N과 M (1) ~ (8)  (0) 2020.02.02

    댓글

Designed by Tistory.