문제풀이/백트래킹
[Javascript/자바스크립트] (프로그래머스) 불량 사용자
딜레이레이
2025. 5. 4. 15:15
https://school.programmers.co.kr/learn/courses/30/lessons/64064
코드
function solution(user_id, banned_id) {
let answer = new Set();
const get_pattern = (id) => {
const transformed = id.replace(/\*/g, ".");
return new RegExp(`^${transformed}$`);
};
const check_banned = (pattern) => {
return user_id.filter((id) => pattern.test(id));
};
const bt = (idx, banned_set) => {
if (idx === banned_id.length) {
answer.add([...banned_set].sort().join("/"));
return;
}
for (const id of candidates[idx]) {
if (!banned_set.has(id)) {
banned_set.add(id);
bt(idx + 1, banned_set);
banned_set.delete(id);
}
}
};
const candidates = [];
for (const banned of banned_id) {
const p = get_pattern(banned);
candidates.push(check_banned(p));
}
bt(0, new Set());
return answer.size;
}
console.log(
solution(["frodo", "fradi", "crodo", "abc123", "frodoc"], ["fr*d*", "abc1**"])
);
//2
console.log(
solution(
["frodo", "fradi", "crodo", "abc123", "frodoc"],
["*rodo", "*rodo", "******"]
)
);
//2
console.log(
solution(
["frodo", "fradi", "crodo", "abc123", "frodoc"],
["fr*d*", "*rodo", "******", "******"]
)
);
//3
get_pattern(): 불량 사용자 아이디를 정규표현식으로 바꾼다. 이때, "*"은 정규표현식에서 단일 문자를 의미하는 "."으로 바꾼다.
check_banned(): 사용자 아이디들(user_id) 중 인자로 주어진 정규표현식(pattern)과 일치하는 아이디들의 배열을 리턴한다.
bt(): 백트래킹을 이용하여 가능한 아이디 조합을 구한다. 이때 가능한 아이디 조합 내에서 중복을 거르기 위해 집합을 사용하고, 또 가능한 아이디 조합들에서도 중복을 거르기 위해 집합을 사용한다.