프로그래밍/알고리즘

순열(Permutation)알고리즘 구현

따봉도치 2020. 6. 12. 22:03

순열 : 서로 다른 n개의 대상에서 r개를 뽑아 일렬로 배열한 것.  (경우의 수 : nPr)

 

1. 순열 알고리즘 

- A, B, C를 모든 경우의 수로 나열하려면

- A를 맨 앞에 두고 나머지 두개를 바꾸는 2가지 + B를 맨 앞에 두고 나머지 두 개를 바꾸는 2가지 + C를 맨 앞에 두고 나머지 두 개를 바꾸는 2가지 = 총 6가지가 된다.

 

 

 

 

- n개의 요소라고 생각하면

1) 0번째 인덱스에 0~n-1까지의 원소를 넣는 경우의 수를 구한다.

ex) 1234, 2134, 3214, 4231 (1,2,3,4 각각이 인덱스 0인 경우들)

 

2) 1번에서 나온 경우에 1번째 인덱스에 1~n-1까지 원소를 넣는 경우를 구한다.

ex) 1234 -> 1234, 1324, 1432 (2,3,4 각각이 인덱스 1인 경우들) / 2134 -> 2134, 2314, 2431

 

3) 위의 과정을 n-1번째 원소까지 반복하여 모든 경우의 수 구한다.

ex) 1234 -> 1234, 1243 / 1324 -> 1324, 1342 ....

 

 

2.nPr 순열

- 위의 적은 과정은 n개의 요소를 모두 나열한 경우의 수고,

- n개 중 r개만 구하고 싶다면 n-1이 아니라, r번만 반복하면 0~r번째까지 돌아서 구할 수 있음

 

void permutation(int[] numbers, int depth, int r) { 
        if (depth == r) {
            for (int i = 0; i < r; i++) {
                System.out.print(numbers[i] + "\t");
            }
            System.out.println();
            return;
        }

        for (int i = depth; i < numbers.length; i++) {
            swap(numbers, depth, i);
            permutation(numbers, depth + 1, r);
            swap(numbers, depth, i);
        }
}
    
void swap(int[] arr, int a, int b){
        int temp = arr[a];
        arr[a] = arr[b];
        arr[b] = temp;
}