Algorithm & Data Structure/이론

순열(Permutation) (+Java 코드)

체리1001 2024. 4. 22.

1. 순열(Permutation)이란

순열은 n개의 숫자 중에서 r개를 뽑아야 할 때 순서를 고려해서 뽑는 것을 말합니다.

순서에 따라 결과가 달라지기 때문에 같은 1,2,3 데이터를 사용하더라도 <123,132,213,231,312,321> 은 모두 다른 결과로 취급하게 됩니다.

 

2. 구현 방법

그렇다면 순열은 코드 상에서 어떻게 구현할 수 있을까요?

(1) depth 변수 사용

depth 변수를 통해 깊이를 이동하며 데이터를 뽑는 방식입니다.

depth 변수는 result 배열의 index를 의미하며 현재 뽑고자 하는 데이터의 위치라고 생각해 주시면 됩니다!

 

depth가 0일 때에는 result[0]의 숫자를 결정합니다.

visited 배열을 통해 아직 사용하지 않은 데이터가 있다면 그 데이터들은 모두 result[0]의 후보가 될 수 있습니다. (visited 배열은 중복 방지를 위해 사용하는 것이므로 중복 순열을 구하고 싶다면 visited 배열을 사용하지 않으면 됩니다!)

 

 

depth가 1일 때에는 result[1]의 숫자를 결정하면 됩니다.

 

depth가 2일 때에는 result[2]의 숫자를 결정하면 됩니다.

/**
    * @param arr 숫자를 뽑아낼 배열
    * @param visited 선택 여부를 체크할 배열
    * @param result 선택한 순열의 결과
    * @param depth 선택할 숫자의 순서
    * @param r 뽑고자 하는 숫자의 개수
    */
    static void permutation(int[] arr, boolean[] visited, int[] result, int depth, int r) {
        if(depth == r) {
            print(result);
            return;
        }

        for(int i=0; i<arr.length; i++) {
            if(!visited[i]) {
                visited[i] = true;
                result[depth] = arr[i];
                permutation(arr, visited, result, depth+1, r);
                visited[i] = false;
            }
        }
    }

    static void print(int[] result) {
        for(int n: result) {
            System.out.print(n);
        }

        System.out.println();
    }

(2) 결과

참고 https://bcp0109.tistory.com/14 https://java-is-happy-things.tistory.com/6

'Algorithm & Data Structure > 이론' 카테고리의 다른 글

조합(Combination) (+Java 코드)  (0) 2024.04.22
다익스트라(dijkstra) 알고리즘 (+Java 코드)  (0) 2024.04.18
이분 탐색 (+Java)  (0) 2021.12.16
BFS와 DFS (+Java 코드)  (0) 2021.12.16
계수 정렬 (+Java 코드)  (0) 2021.08.09

댓글