
DFS로 푸는 문제
check는 일단 밴 아이디(a)와 유저 아이디(b) 길이가 맞지 않으면 false, a[i]가 *이라면 b[i]는 검사할 필요가 없고, 아니라면 같은지 확인해서 return 한다.user_id -> frodo fradi crodo abc123 frodocbanned_id -> fr*d* abc1**vector v는,v -> {frodo fradi} {abc123}dfs를 이용하는데 재귀를 사용한다.list는 그래프 깊이 idx의 vector이고 list를 하나씩 체크하는데,set에 그 아이디(list[i])가 없다면 insert 해서 다시 재귀를 돌린다.(그 깊이의 노드 탐색은 완료했으니 다음 노드 탐색)idx==v.size()가 되면 마지막 깊이까지 탐색했다는 뜻이므로 allSet에 넣고 return 한다.allSet은 같은 경우의 수가 중복될 수 있어서 사용하는 set이다.#include <string>
#include <vector>
#include <set>
#include <iostream>
using namespace std;
vector<vector<string>> v;
set<set<string>> allSet;
void DFS(set<string> id, int idx)
{
if(idx==v.size())
{
allSet.insert(id);
return;
}
vector<string> list = v[idx];
for(int i=0;i<list.size();i++)
{
if(id.find(list[i])!=id.end()) continue; // set에 이미 아이디가 있다면
set<string> tmp = id;
tmp.insert(list[i]);
DFS(tmp, idx+1);
}
return;
}
bool check(string a, string b)
{
if(a.size()!=b.size()) return false;
for(int i=0;i<a.size();i++)
{
if(a[i]=='*') continue;
if(a[i]!=b[i]) return false;
}
return true;
}
int solution(vector<string> user_id, vector<string> banned_id) {
for(int i=0;i<banned_id.size();i++)
{
vector<string> tmp;
for(int j=0;j<user_id.size();j++)
{
if(check(banned_id[i], user_id[j])) // 일치한다면
{
tmp.push_back(user_id[j]);
}
}
v.push_back(tmp);
}
set<string> s;
DFS(s, 0);
return allSet.size();
}