https://programmers.co.kr/learn/courses/30/lessons/64064
function solution(user_id, banned_id) {
dfs(user_id, banned_id, []);
let temp = [];
arr.forEach(el => {
temp.push(el.sort().join());
})
console.log(new Set(temp))
let answer = new Set(temp).size
return answer;
}
let arr = [];
function dfs(user_id, banned_id, ban) {
// console.log(`user : ${user_id}, ban : ${banned_id}, ban : ${ban}`);
if (banned_id.length == 0) { arr.push(ban);}
else {
for (let i = 0; i < user_id.length; i++) {
if (match(user_id[i], banned_id[0])) {
dfs([...user_id.slice(0, i), ...user_id.slice(i + 1)], banned_id.slice(1), [...ban, user_id[i]])
}
}
}
}
function match(userid, banid) {
let u_len = userid.length;
let b_len = banid.length;
let chk = 0;
if (u_len != b_len) return false;
for (let i = 0; i < b_len; i++) {
if (banid[i] == '*' || banid[i] == userid[i]) chk++;
else return false;
}
if(chk==b_len) return true;
}
let user_id = ["frodo", "fradi", "crodo", "abc123", "frodoc"];
let banned_id = ["*rodo", "*rodo", "******"];
console.log(solution(user_id, banned_id));
처음에 조합을 생각하고, 담아둔 배열을 match를 해서 true면 다음 dfs돌리고 마지막에 담긴 arr에 중복을 제거하고 결과를 리턴해야겠다고 생각했다.
먼저, match부터 작성하였고, 중복을 작성하는데 구현하다가 막혀서 결국 다른 코드를 보게되었다.
banned_id를 다 탐색했으면, arr에다 결과를 push하고, match가 true일 때 다시 dfs를 돌렸다.
마지막에 중복제거를 하는데 그냥 new Set(arr)을 했더니 내가 생각한거 처럼 되지 않았다.
그래서 dfs를 참고한 곳에서도 같은 고민을 했던것을 확인했습니다.
그래서 이 문제를 해결하기 위해 arr의 요소들을 우선 정렬하고, 그것들을 join을 하면 c,a,b / b,a,c가 a,b,c로 정렬되고 Set에 저장하면 중복이 제거가 됩니다.
그래서 마지막에 Set의 크기를 출력하면 정답이 나왔습니다.
match를 할때 정규표현식을 이용하는 방법도 있음.