1. ์ˆœ์—ด Permutation

  • ๊ธธ์ด๊ฐ€ n๊ฐœ์ธ ๋ฐฐ์—ด์—์„œ r๊ฐœ์˜ ์š”์†Œ๋ฅผ ์ฐจ๋ก€๋กœ ๋ฝ‘์•„ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค์—ˆ์„ ๋•Œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฐฐ์—ด(์ค‘๋ณต์ œ์™ธ)
    → ์ˆœ์—ด, ์ค‘๋ณต ์ˆœ์—ด, ์กฐํ•ฉ, ์ค‘๋ณต์กฐํ•ฉ ๋ชจ๋‘ n๊ฐœ์—์„œ r๊ฐœ๋ฅผ ๋ฝ‘๋Š”๋‹ค๋Š” ์ ์—์„œ ๋™์ผ
  • ์ˆœ์—ด์˜ ์ •์˜์—์„œ๋Š” ์ •๋ ฌ.  ์ˆœ์„œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ํŠน์ง•
public class AlgorithmStudy {
    public static void permutation(int[] arr, int[] out, boolean[] visited, int depth, int r){
        if(depth == r){
            for(int num: out) System.out.print(num);
            System.out.println();
            return;
        }
        for(int i=0; i<arr.length; i++){
            if(!visited[i]){
                visited[i] = true;
                out[depth] = arr[i];
                permutation(arr, out, visited, depth+1, r);
                visited[i] = false;
            }
        }
    }

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

→ ๊ฒฐ๊ณผ :  1 2 / 1 3 / 2 1 / 2 3 / 3 1 / 3 2

 

2. ์ค‘๋ณต ์ˆœ์—ด

  • ์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ์—์„œ ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ r๊ฐœ๋ฅผ ๋ฝ‘์•„์„œ ์ •๋ ฌํ•˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
  • ์ˆœ์„œ๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์ˆœ์—ด๊ณผ ๋™์ผ. ๊ฐ™์€ ์›์†Œ๋ฅผ ์ค‘๋ณตํ•ด์„œ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์ฐจ์ด
    → ์ˆœ์—ด ์ฝ”๋“œ์—์„œ ์ค‘๋ณต๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ๋˜ visited ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๋ฉด ๋œ๋‹ค.
public class AlgorithmStudy {
    public static void permutation(int[] arr, int[] out, int depth, int r){
        if(depth == r){
            for(int num: out) System.out.print(num);
            System.out.println();
            return;
        }
        for(int i=0; i<arr.length; i++){
            out[depth] = arr[i];
            permutation(arr, out, depth+1, r);
        }
    }

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

→ ๊ฒฐ๊ณผ :  1 1 / 1 2 / 1 3 /  2 1 / 2 2 / 2 3 / 3 1 / 3 2 / 3 3


 

3. ์กฐํ•ฉ Combination

  • ์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ์—์„œ ์ˆœ์„œ ์—†์ด r๊ฐœ๋ฅผ ๋ฝ‘๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜(์ค‘๋ณต์ œ์™ธ)
    →[1, 2] ์™€ [2, 1]์„ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰ โ–ท ์ด ๊ฒฝ์šฐ [1, 2]๋งŒ ์นด์šดํŒ…
  • ์ˆœ์„œ ์ƒ๊ด€์ด ์—†๊ณ , ์ค‘๋ณต๋„ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์„ ํƒ๋œ ์›์†Œ๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•˜์ง€ ์•Š๊ณ , 
    ์›์†Œ๋“ค๊ณผ visited๋งŒ ์ด์šฉํ•˜์—ฌ ๋ฐฉ๋ฌธํ•œ ์›์†Œ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ํ™•์ธํ•˜๋ฉด ๊ณง ์„ ํƒ๋œ ์กฐํ•ฉ
public class AlgorithmStudy {
    public static void combination(int[] arr, boolean[] visited, int start, int depth, int r){
        if(depth == r){
            for(int i=0; i<arr.length; i++){
                if(visited[i]) System.out.print(arr[i]);
            }
            System.out.println();
            return;
        }
        for(int i=start; i<arr.length; i++){
            if(!visited[i]){
                visited[i] = true;
                combination(arr, visited, i+1, depth+1, r);
                visited[i] = false;
            }
        }
    }

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

→ ๊ฒฐ๊ณผ : 1 2 / 1 3 / 2 3

 

4. ์ค‘๋ณต ์กฐํ•ฉ

  • ์„œ๋กœ ๋‹ค๋ฅธ n๊ฐœ์—์„œ ์ˆœ์„œ ์—†์ด, ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ r๊ฐœ๋ฅผ ๋ฝ‘๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜
  • ์ˆœ์„œ ์—†์ด ๋ฝ‘๋Š” ์กฐํ•ฉ๊ณผ ๋™์ผํ•˜์ง€๋งŒ, ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์—์„œ ์ฐจ์ด(์ฆ‰, ์ด๋ฏธ ๋ฝ‘์€ ๊ฒƒ์„ ๋˜ ๋ฝ‘์„ ์ˆ˜ ์žˆ์Œ)
    → ์กฐํ•ฉ ์ฝ”๋“œ์—์„œ ์ค‘๋ณต๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด์‚ฌ์šฉํ–ˆ๋˜ visited ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๋ฉด ๋œ๋‹ค.
    → ์ค‘๋ณต์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์„ ํƒํ•œ ์›์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด ํ•„์š”
public class AlgorithmStudy {
    public static void combination(int[] arr, int[] out, int start, int depth, int r){
        if(depth == r){
            for(int num : out) System.out.print(num);
            System.out.println();
            return;
        }
        for(int i=start; i<arr.length; i++){
            out[depth] = arr[i];
            combination(arr, out, i, depth+1, r);
        }
    }

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

๊ฒฐ๊ณผ → 1 1 / 1 2 / 1 3 / 2 2 / 2 3 / 3 3

 

 

๋”๋ณด๊ธฐ

+ Recent posts