

이런식으로 banned_id에 맞는 형식인 아이디 찾아서 조합으로 만든다.
이때 중복된게 있으면 안된다.
다른 사람들 코드 보니까 처음부터
'fr^d^':[ ] 이런식으로 obj 분류안하고 그냥 정규표현식만 구한뒤바로 dfs 구하는것을 보았다. .
function solution(user_id, banned_id) {
const selected = Array(user_id.length).fill(false);
const regex = banned_id.map(id => new RegExp(`^${id.replaceAll('*', '.')}$`));
const set = new Set();
const dfs = (index = 0, arr = []) => {
if (index === banned_id.length) {
set.add(arr.sort().join(','));
} else {
for (let i = 0; i < user_id.length; i++) {
if (selected[i]) {
continue;
}
if (user_id[i].match(regex[index])) {
selected[i] = true;
dfs(index + 1, [...arr, user_id[i]]);
selected[i] = false;
}
}
}
};
dfs();
return set.size;
}
function solution(user_id, banned_id) {
var answer = 0;
const str= function(stt){
var new_str=stt.replaceAll('*','[a-z0-9]');
return new_str;
}
var obj={};
const set = new Set();
for(var i=0; i<banned_id.length; i++){
var hey= new RegExp(`${str(banned_id[i]) }`)
for(var zz=0; zz<user_id.length; zz++){
if(banned_id[i].length== user_id[zz].length
&& hey.test(user_id[zz])
){
if(!obj[banned_id[i]]){
obj[banned_id[i]]=[user_id[zz]]
}
else{
if(obj[banned_id[i]].includes(user_id[zz])==false){
obj[banned_id[i]].push(user_id[zz]);
}
}
}
}
}
const dfs= function(ima,arrr,banned_id){
if(ima>=banned_id.length){
var new__=arrr.slice()
//여기서 복사하는 이유 !! 가장 중요하다. 얕은 복사를 안하고 바로 set 에 넣으면 정렬된 arrr이
//이전 ima-=1 에도 영향을 미쳐서 값이 완전 이상하게 나온다. 따라서 얕은 복사후 정렬안된것을
// 넘겨야 한다.
set.add(new__.sort().join(','));
return;
}
for(var go=0; go< obj[banned_id[ima]].length; go++){
if(arrr.includes(obj[banned_id[ima]][go])
)
{
continue;
}
else{
arrr.push(obj[banned_id[ima]][go]);
dfs(ima+1, arrr,banned_id);
arrr.pop();
}
}
}
dfs(0,[],banned_id);
return set.size;
}