DFS
로 푸는 문제
check
는 일단 밴 아이디(a
)와 유저 아이디(b
) 길이가 맞지 않으면 false
, a[i]
가 *
이라면 b[i]
는 검사할 필요가 없고, 아니라면 같은지 확인해서 return 한다.user_id
-> frodo
fradi
crodo
abc123
frodoc
banned_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();
}