https://school.programmers.co.kr/learn/courses/30/lessons/64064?language=cpp

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

#include <string>
#include <vector>
#include <set>
using namespace std;

bool isEqual(string user_id, string banned_id){
    if(user_id.size()!=banned_id.size()) return false;
    for(int i=0;i<user_id.size();i++){
        if(banned_id[i]!='*' && banned_id[i]!=user_id[i]){
            return false;
        }
    }
    return true;
}

void dfs(int depth, vector<string>& user_id, vector<string>& banned_id, 
         vector<bool>& visited, set<string>& result) {
    if(depth == banned_id.size()) {
        string temp = "";
        for(int i=0; i<visited.size(); i++) {
            if(visited[i]) temp += to_string(i);
        }
        result.insert(temp);
        return;
    }

    for(int i=0; i<user_id.size(); i++) {
        if(!visited[i] && isEqual(user_id[i], banned_id[depth])) {
            visited[i] = true;
            dfs(depth+1, user_id, banned_id, visited, result);
            visited[i] = false;
        }
    }
}

int solution(vector<string> user_id, vector<string> banned_id) {
    vector<bool> visited(user_id.size(), false);
    set<string> result;

    dfs(0, user_id, banned_id, visited, result);

    return result.size();
}
kwon-record