728x90
문제
https://school.programmers.co.kr/learn/courses/30/lessons/64064
풀이
정규 표현식을 통해 모든 사용자의 아이디 중 불량 사용자들을 색출했다. 불량 사용자의 경우 영어 소문자 혹은 *문자로 구성되어있다. *문자는 모든 영문자가 올 수 있다는 가능성이 있다는 것을 알려주며, *를 제외한 나머지 문자를 이용해 사용자의 아이디를 색출해야한다. 정규 표현식에서 . 문자는 모든 문자가 올 수 있음을 설정하는 문자이며, 이렇게 정규 표현식을 생성했다.
const regArr = banned_id.map(e => new RegExp(`^${e.replaceAll("*", ".")}$`));
이렇게 색출된 불량 사용자들의 경우의 수를 구해야한다. dfs 알고리즘을 이용해 경우의 수를 구한다. 불량 사용자의 수만큼 색출했음을 나타내는 dfs 깊이와 불량 사용자로 색출된 이름을 담은 배열을 전달한다.
불량 사용자들을 담은 배열을 문자열 방식으로 변환하여 Set에 추가한다. Set을 이용하는 이유는 중복된 경우를 방지하기 위해 사용한다.
코드
function solution(user_id, banned_id) {
const check = Array.from({ length: user_id.length }, () => false);
const regArr = banned_id.map(e => new RegExp(`^${e.replaceAll("*", ".")}$`));
const set = new Set();
const dfs = (index, arr) => {
if (index === banned_id.length) {
set.add(arr.sort().join(','));
}
else {
for (let i = 0; i < user_id.length; i++) {
if (check[i]) continue;
if (user_id[i].match(regArr[index])) {
check[i] = true;
dfs(index + 1, [...arr, user_id[i]]);
check[i] = false;
}
}
}
};
dfs(0, []);
return set.size;
}
728x90
'코딩 테스트 > 프로그래머스 코딩 테스트 연습' 카테고리의 다른 글
[JS] 연속 펄스 부분 수열의 합 (0) | 2024.08.04 |
---|---|
[JS] 징검다리 건너기 (0) | 2024.08.01 |
[JS] 두 원 사이의 정수 쌍 (1) | 2024.07.26 |
[JS] 과제 진행하기 (0) | 2024.07.25 |
[JS] 우박수열 정적분 (0) | 2024.07.24 |