[프로그래머스]불량 사용자
📖 문제
✏️ 나의 풀이
우선 정규식을 이용해 불량 사용자와 매칭 되는 사용자를 찾을 수 있도록 작성하였다.
또한, 불량 사용자의 길이도 같이 만들어두어 길이와 정규식을 이용하였다.
const [reg, len] = [
new RegExp(`${ban.replace(/\*/g, ".")}`),
ban.length,
];
정규식을 이용해 길이까지 한번에 할 수도 있겠지만, 정규식에 대해 잘 알지 못해 우선은 이런식으로 작성하였다.
그 다음, 불량 사용자 아이디 목록에 해당하는 사용자 아이디를 하나의 배열로 선언해주었다.
const answer = banned_id.map((ban) => {
const [reg, len] = [
new RegExp(`${ban.replace(/\*/g, ".")}`),
ban.length,
];
return (user_id.map((user) => {
if (user.length !== len) return false;
const r = reg.test(user);
return r ? user : false;
}).filter((v) => v));
}).sort((a, b) => b.length - a.length);
그 다음은 dfs를 이용해 경우의 수를 구해주었다.
const test = new Set();
const dfs = (index, visited) => {
if (index === answer.length) {
test.add(visited.sort().join(""));
return true;
}
const res = [];
for (let i = 0; i < answer[index].length; i++) {
if (visited.includes(answer[index][i])) continue;
const newVisited = [...visited, answer[index][i]];
dfs(index + 1, newVisited);
}
return res;
};
dfs를 이용해 가장 마지막 index에 접근하였을때 불량 아이디 수만큼의 제재 아이디 수를 visited에 갖고 있기에
if (index === answer.length) {
test.add(visited.sort().join(""));
return true;
}
위와 같이 test 변수에 visited에 있는 모든 값들을 정렬후 문자열로 만들어 추가해두었다.
이렇게 하면 이전에 다른 순서로 test 변수에 있더라도 test 변수는 set 자료형이기에 중복은 자동적으로 제거된다.
👩💻 코드
function solution(user_id, banned_id) {
const answer = banned_id
.map((ban) => {
const [reg, len] = [
new RegExp(`${ban.replace(/\*/g, ".")}`),
ban.length,
];
return user_id
.map((user) => {
if (user.length !== len) return false;
const r = reg.test(user);
return r ? user : false;
})
.filter((v) => v);
})
.sort((a, b) => b.length - a.length);
const test = new Set();
const dfs = (index, visited) => {
if (index === answer.length) {
test.add(visited.sort().join(""));
return true;
}
const res = [];
for (let i = 0; i < answer[index].length; i++) {
if (visited.includes(answer[index][i])) continue;
const newVisited = [...visited, answer[index][i]];
dfs(index + 1, newVisited);
}
return res;
};
const r = dfs(0, []);
return test.size;
}
댓글남기기