function solution(user_id, banned_id) {
function dfs(user, idx, str, table) {
if (idx === user.length) {
if (table[str]) {
table[str].push(user);
} else {
table[str] = [user];
}
return;
}
dfs(user, idx + 1, str + user[idx], table);
dfs(user, idx + 1, str + "*", table);
}
function getList(user, idx, list, answer) {
if (list.length === banned_id.length) {
if (!answer.includes(list.sort().join(""))) {
answer.push(list.join(""));
}
return;
}
for (let i = 0; i < user[idx].length; i++) {
if (!list.includes(user[idx][i])) {
getList(user, idx + 1, [...list, user[idx][i]], answer);
}
}
}
let table = {};
let bannedIdList = [];
let answer = [];
user_id.forEach((user) => dfs(user, 0, "", table));
for (let bannedUser of banned_id) {
bannedIdList.push(table[bannedUser]);
}
getList(bannedIdList, 0, [], answer);
return answer.length;
}
"frodo"
"fradi"
table = {
"frodo" :["frodo"],
"*rodo" :["frodo"],
"**odo" :["frodo"],
....
"fr*d*" :["frodo","fradi"],
}
해당 역할은 함수 dfs()
가 한다
function dfs(user, idx, str, table) {
if (idx === user.length) {
if (table[str]) {
table[str].push(user);
} else {
table[str] = [user];
}
return;
}
dfs(user, idx + 1, str + user[idx], table);
dfs(user, idx + 1, str + "*", table);
}
user_id.forEach((user) => dfs(user, 0, "", table));
banned_id
불량사용자 목록을 받아 제재아이디 후보를 작성한다for (let bannedUser of banned_id) {
// bannedUser : "fr*d*"
sanctionIdList.push(table[bannedUser]);
// table[bannedUser] : ["frodo","fradi"]
}
sanction
은 제재
라는 뜻이라고 한다... (변수명 짓기 어렵다)sanctionIdList
에서 제재 아이디 목록을 작성한다sanctionIdList = [
[ 'frodo', 'fradi' ],
[ 'frodo', 'crodo' ],
[ 'abc123', 'frodoc' ],
[ 'abc123', 'frodoc' ]
]
이제 해당 제재 아이디 목록에서 아이디를 하나씩 뽑아 순서와 상관 없는 조합
을 하면 된다.
"frodo"
를 선택했으면 두번째 제재아이디 목록에서 "frodo"
가아닌 "crodo"
를 선택해야한다나는 정석적인 조합
알고리즘 보다는 dfs와 문자열을 사용해 꼼수를 써서 구현했다.
function getList(user, idx, list, answer) {
if (list.length === banned_id.length) {
// 정렬후 문자열을 저장, 같은 목록인지 중복을 체크한다
if (!answer.includes(list.sort().join(""))) {
answer.push(list.join(""));
}
return;
}
for (let i = 0; i < user[idx].length; i++) {
if (!list.includes(user[idx][i])) {
getList(user, idx + 1, [...list, user[idx][i]], answer);
}
}
}
....
return answer.length; // 갯수를 return한다