View

λ°˜μ‘ν˜•

πŸ’‘μˆœμ—΄(Permutation)

: μ„œλ‘œ λ‹€λ₯Έ n개의 μ›μ†Œμ—μ„œ r개λ₯Ό 쀑볡없이 μˆœμ„œμ— μƒκ΄€μžˆκ²Œ μ„ νƒν•˜λŠ” ν˜Ήμ€ λ‚˜μ—΄ν•˜λŠ” 것을
μˆœμ—΄(permutation)이라고 ν•œλ‹€. (λ‚˜λ¬΄μœ„ν‚€)

//nPr 

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        R = sc.nextInt();
        input = new int[N];
        numbers = new int[R];
        isSelected = new boolean[N]; // λ°©λ¬Έ μ—¬λΆ€λ₯Ό μ²΄ν¬ν•˜κΈ° μœ„ν•¨

        for (int i = 0; i < N; i++) {
            input[i] = sc.nextInt();
        }
        permutation(0);
    }

    private static void permutation(int cnt) {
        if(cnt == R) { // R개의 μ›μ†Œλ₯Ό λ‹€ λ½‘μ•˜λ‹€λ©΄ return
            System.out.println(Arrays.toString(numbers));
            return;
        }
        for(int i=0; i<N; ++i) {
             //λ½‘μœΌλ €λŠ” μˆ˜κ°€ μ‚¬μš© 됐닀면
            if(isSelected[i]) continue;

            // λ½‘μœΌλ €λŠ” μˆ˜κ°€ μ‚¬μš©λ˜μ§€ μ•Šμ•˜λ‹€λ©΄ 

            // 배열에 λ„£μ–΄μ€Œ
            numbers[cnt] = input[i];
            // μ‚¬μš©μ²˜λ¦¬ true
            isSelected[i] = true;
            permutation(cnt+1);
            // R개의 μ›μ†Œ 생성 ν›„ μ‚¬μš©μ²˜λ¦¬ λ‹€μ‹œ ν•΄μ œ 
            isSelected[i] = false;
        }
    }

🚨 μ£Όμš” 포인트

booleanνƒ€μž…μ˜ isSelected 배열을 ν†΅ν•΄μ„œ μ›μ†Œλ₯Ό λ½‘μ•˜λŠ”μ§€ μ•ˆλ½‘μ•˜λŠ”μ§€ μ²΄ν¬ν•˜λŠ” 것이 ν¬μΈνŠΈλ‹€

쀑볡 μˆœμ—΄μ˜ 경우(1,1,1), (1,2,1),(2,1,1)

isSelected 배열을 톡해 μ›μ†Œ 체크λ₯Ό ν•˜μ§€ μ•Šμ•„λ„ λœλ‹€


πŸ’‘μ‘°ν•©(Combination)

: μ„œλ‘œ λ‹€λ₯Έ n개의 μ›μ†Œλ₯Ό κ°€μ§€λŠ” μ–΄λ–€ 집합 (사싀, 집합은 μ„œλ‘œ λ‹€λ₯Έ μ›μ†Œμ˜ λͺ¨μž„μœΌλ‘œ μ •μ˜λœλ‹€.)

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        R = sc.nextInt();
        input = new int[N];
        numbers = new int[R];

        for (int i = 0; i < N; i++) {
                input[i] = sc.nextInt();
        }
        combination(0,0);
    }

    private static void combination(int cnt,int start) {
        if(cnt == R) { //R개의 μ›μ†Œλ₯Ό λ‹€ λ½‘μ•˜λ‹€λ©΄ 
                System.out.println(Arrays.toString(numbers));
                return;
        }
        for(int i=start; i<N; i++) { //i =start
                // 배열에 λ„£μ–΄μ€Œ
                numbers[cnt] = input[i]; 
                // λ‹€μž¬κ·€λ₯Ό start+1이 값이 μ•„λ‹Œ i+1 
                combination(cnt+1,i+1);
        }
    }

🚨 μ£Όμš” 포인트

쑰합은 startλ₯Ό κΈ°μ€€μœΌλ‘œ (ν˜„μž¬ λ½‘νžŒ 수 λ‹€μŒ i+1)λ₯Ό ν˜ΈμΆœν•˜κΈ°μ— 쀑볡될 일이 μ—†κ³  (2,4,6) (4,2,6)κ³Ό 같은 κ²½μš°λ„ μ œκ±°ν•œλ‹€.

쀑볡 μ‘°ν•©μ˜ 경우, μž¬κ·€λ‘œ λ„˜κΈΈ λ•Œ start의 값을 μ‹ κ²½ 써주면 λœλ‹€

combination(cnt+1, i) // 자기 μžμ‹ λ„ 포함될 수 있게


πŸ’‘λΆ€λΆ„μ§‘ν•©(SubSet)

: 집합 A={a, b, c}의 λͺ¨λ“  뢀뢄집합을 μ°Ύμ•„ λ‚˜μ—΄ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

βˆ…, {a}, {b}, {c}, {a,b}, {b,c}, {a,c}, {a,b,c} 즉, A의 λΆ€λΆ„μ§‘ν•©μ˜ μ΄μˆ˜λŠ” 2^nκ°œμ΄λ‹€


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        N = sc.nextInt();
        input = new int[N];
        isSelected = new boolean[N];
        for(int i=0; i<N; ++i) {
            input[i] = sc.nextInt();
        }
        generateSubSet(0);

    }

    //count: ν˜„μž¬κΉŒμ§€ κ³ λ €ν•œ μ›μ†Œ 수
    private static void generateSubSet(int count) { 

        if(count==N) {
            for(int i=0; i<N; ++i) {
                if (isSelected[i]){
                        System.out.print(input[i]+" ");
                    }
            }
            System.out.println();
            return;
        }

        // μ›μ†Œ 선택
        isSelected[count] = true;
        generateSubSet(count+1);

        // μ›μ†Œ 미선택 
        isSelected[count] = false;
        generateSubSet(count+1);
    }

🚨 μ£Όμš” 포인트

μ›μ†Œλ₯Ό μ„ νƒν•˜λŠ” 것과 그렇지 μ•Šμ„ λ•Œ,

2κ°€μ§€λ‘œ λ‚˜λˆ„μ–΄ κ΅¬ν˜„ν•˜λŠ” 것이 μ€‘μš”

λ°˜μ‘ν˜•
Share Link
reply
λ°˜μ‘ν˜•
Β«   2024/11   Β»
일 μ›” ν™” 수 λͺ© 금 ν† 
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30