Algorithm/inflearn

순열 구하기(DFS)

마닐라 2021. 10. 4. 23:00

 

 

중복순열문제와는 다르게 사용 여부를 체크하는 배열이 필요하다.

그리고 1부터 N까지의 순열이 아니고 입력값 배열로 주어진다.

크게 보자면 중복순열을 방지하기위해 사용 여부 체크하는 배열만 달라졌다!

사용 여부를 체크하는 배열 - ch

출력할 숫자를 넣어놓을 배열 - pm

순열로 사용할 숫자들이 들어있는 배열 - arr

 

 

import java.util.*;

public class Main {
    static int[] pm, ch, arr;
    static int n, m;
    public void DFS(int L){
        //순열의 완성
        if(L == m) {
            for(int x : pm) System.out.print(x + " ");
            System.out.println();
        }
        else {
            //n가닥으로 뻗어나가야 한다.
            for(int i = 0; i < n; i++) {
                //현재 사용하지 않는 숫자면
                if(ch[i] == 0){
                    //현재 인덱스를 사용한다.
                    ch[i] = 1;
                    //출력 배열에 해당 인덱스의 값 넣어준다.
                    pm[L] = arr[i];
                    //다음 숫자로 넘어가보자.
                    DFS(L+1);
                    //출력하고 나서 다시 0으로 변경해준다.
                    ch[i] = 0;
                }
            }
        }
    }
    public static void main(String[] args) {
        Main T = new Main();
        Scanner kb = new Scanner(System.in);
        n = kb.nextInt(); //숫자의 갯수
        m = kb.nextInt(); //뽑는 갯수
        arr = new int[n];
        for(int i = 0; i < n; i++) arr[i] = kb.nextInt();
        ch = new int[n];
        pm = new int[m];
        T.DFS(0);
    }
}

'Algorithm > inflearn' 카테고리의 다른 글

★★★조합 구하기(DFS)  (0) 2021.10.04
조합수(메모이제이션)  (0) 2021.10.04
동전교환(DFS, BFS)  (0) 2021.10.03
중복순열 구하기(DFS)  (0) 2021.10.03
최대점수 구하기(DFS)  (0) 2021.10.03