티스토리 뷰

알고리즘

82. 순열구하기 [DFS]

홍복치 2021. 2. 17. 21:22

인프런 - it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비 강의를 바탕으로 공부한 내용입니다.

문제는 비공개로 입력예제와 출력예제만을 가지고 포스팅

 

 

풀이 

- 순열 경우의 수를 DFS로 구현

- A배열에 들어있는 원소들을 n개의 가지로 뻗어나가면서 방문한다.

=> 이때 ch가 1이면 방문한 것이므로 제외하고 방문하지 않았을 시 res[L](경로 출력위함)에 a[i]값을 넣고 ch[i]=1로 바꾼다.

=> DFS(L+1)로 다음레벨로 내려간다.

=> 한 경로가 끝난후에 (L==r) 레벨별로 방문한 정점을 담아놓은 res배열을 출력하고, 경로의 개수를 +1한다.

=> 그 이후 puts("")로 행을 바꿔준다.

=> DFS 함수가 끝난 후 경로 개수 cnt를 출력한다.

 

#include <stdio.h>
#include <algorithm>
using namespace std;
int n, r, cnt=0;
int a[20], res[20], ch[20];

//82. 순열구하기 (DFS)
void DFS(int L){
    if(L==r){
        //마지막 레벨까지 가면 경로를 출력
        for(int j=0;j<L;j++){
            printf("%d ", res[j]);
        }
        cnt++;
        puts("");
    }else{
        for(int i=1;i<=n;i++){
            if(ch[i]==0){
                //방문한다
                res[L]=a[i];
                ch[i]=1;
                DFS(L+1);
                ch[i]=0;
            }
        }
    }
}


int main(){
    scanf("%d %d", &n, &r);
    for(int i=1;i<=n;i++){
        scanf("%d", &a[i]);
    }
    DFS(0);
    printf("%d\n", cnt);
    return 0;
}

'알고리즘' 카테고리의 다른 글

81. 벨만-포드 알고리즘  (0) 2021.02.25
80. 다익스트라 알고리즘  (0) 2021.02.22
79. 원더랜드 [Prim 알고리즘 이용]  (0) 2021.02.15
78. 원더랜드 [Kruskal MST 알고리즘]  (0) 2021.02.10
77. 친구인가  (0) 2021.02.09
최근에 올라온 글
Total
Today
Yesterday