본문 바로가기

Algorithm/DFS

(C++) - 백준(BOJ) 5568번 : 카드놓기

반응형

https://www.acmicpc.net/problem/5568

 

5568번: 카드 놓기

예제 1의 경우 상근이는 11, 12, 21, 112, 121, 122, 212를 만들 수 있다.

www.acmicpc.net

순열문제였습니다.

 

풀이방법

 1. 자기자신을 뽑지 않으면서 순서 상관있도록 뽑으면됩니다.

 

 2. 카드를 뽑았으면 카드들을 나열한 뒤 set에 넣어줍니다.

 

 3. set의 size를 출력합니다.

 

Code

#include <bits/stdc++.h>
using namespace std;
int n,k;
vector <string> card;
set <string> cardSet;
vector <string> tmp;
int ck[11];
void dfs(int depth){
    if(depth == k){
        string c;
        for(auto t : tmp) c += t;
        cardSet.insert(c);
        return;
    }
    for(int i = 0; i < n; i++){
        if(ck[i]) continue;
        ck[i] = 1;
        tmp.push_back(card[i]);
        dfs(depth + 1);
        tmp.pop_back();
        ck[i] = 0;
    }
}

int main(){
    cin >> n >> k;
    for(int i = 0; i < n; i++){
        string s;
        cin >> s;
        card.push_back(s);
    }
    dfs(0);
    cout << cardSet.size() << '\n';
}