Java

[JAVA] JAVA에서 순열 (Permutation)

씬프 2021. 6. 2. 15:06
반응형

참고 사이트

 

순열 Permutation (Java)

순열 연습 문제 순열이란 n  개의 값 중에서 r  개의 숫자를 모든 순서대로 뽑는 경우를 말합니다. 예를 들어 [1, 2, 3]  이라는 3 개의 배열에서 2 개의 숫자를 뽑는 경우는 [1, 2] [1, 3] [2, 1] [2, 3] [3,

bcp0109.tistory.com

순열

n개의 원소 중에서 r개를 순서대로 뽑는 경우의 수

 

Swap을 이용한 순열

배열의 첫번째 값부터 순서대로 하나씩 바꾸며 모든 값을 한번씩 swap한다.

depth 기준 인덱스로 이보다 인덱스가 작으면 고정, 큰 값들만으로 swap

순열의 순서가 보장되지 않는다.

import java.util.*;


public class Main {
    // r은 몇개 꺼낼지
    public static void permutation(int[] arr, int depth, int r) {
        if (depth == r) {
            //순열 끝 출력
            for (int i = 0; i < r; i++) {
                System.out.print(arr[i] + " ");
            }
            System.out.println();
            return;
        }
        for (int i = depth; i < arr.length; i++) {
            swap(arr, depth, i); // 바꾸고
            permutation(arr, depth+1, r);
            swap(arr, depth, i); // 자기 자신 복원
        }
        
    }

    public static void swap (int[] arr, int depth, int i) {
        int tmp = arr[depth];
        arr[depth] = arr[i];
        arr[i] = tmp;
    }

    public static void main(String[] args) {
        
        int[] arr = {1,2,3};
        permutation(arr, 0, 3);

    }
}

 

Visited 배열을 이용한 순열

사전식으로 순열을 구현할 수 있다. (원하는 순서대로)

아웃풋을 하나씩 늘려가면서 (depth가 인덱스 역할) 하나씩 뽑아서 저장한다는 느낌.

import java.util.*;


public class Main {

    public static void permutation(int[] arr, int[] output, boolean[] visited, int depth, int r) {
        if (depth == r) {
            for (int i = 0; i < r; i++) {
                System.out.print(output[i] + " ");
            }
            System.out.println();
            return;
        }
        
        for (int i = 0; i < arr.length; i++) {
            if (!visited[i]) {
                visited[i] = true;
                output[depth] = arr[i];
                permutation(arr, output, visited, depth+1, r);
                // output[depth] = 0;
                visited[i] = false;
            }
        }
    }

    public static void main(String[] args) {
        
        int[] arr = {1,2,3};
        int r = 3;
        int[] output = new int[r];
        boolean[] visited = new boolean[arr.length];
        permutation(arr, output, visited, 0, r);

    }
}

 

추가 참고 사이트

 

순열(Permutation) 알고리즘 Java로 구현하기

안녕하세요. Message입니다. 오늘은 순열 알고리즘을 Java로 구현하는 부분에 대해 간단히 포스팅 하고자 합니다. 개인적으로 조합보다 순열 알고리즘을 이해하는데 좀 더 시간이 걸렸고, 생각해야

redscreen.tistory.com

 

'Java' 카테고리의 다른 글

[Java Error] actual and formal argument lists differ in length  (0) 2021.06.22
[JAVA] JAVA에서 조합 (Combination)  (0) 2021.06.01
[Java] 열거형 enums  (0) 2021.05.28
[Java] HashMap 클래스  (0) 2021.05.27
[Java] TreeSet 클래스  (0) 2021.05.26