말랑한 하루

[Programmers] 불량 사용자 (Lv 3, JavaScript) 본문

문제풀이/Programmers

[Programmers] 불량 사용자 (Lv 3, JavaScript)

지수는말랑이 2022. 7. 20. 17:53
반응형

[ 학습 내용 ]
정규표현식 활용 및 얕은복사 필요성

[ 소스 코드 ]

function solution(user_id, banned_id) {
    var answer = 0;
    var list_all = [];

    function matches(u_id, b_id) {
        var pattern = b_id.replace(/\*/g, ".");
        var reg = new RegExp(`\^${pattern}\$`);
        return reg.test(u_id);
    }
    
    function dfs(list_id, ban_idx, cnt) {
        if (cnt === banned_id.length) {
            list_all.push([...list_id]);
            return;
        }
        for(var i=0; i<user_id.length; i++) {
            if (list_id.indexOf(user_id[i]) !== -1) continue;
            if (!matches(user_id[i], banned_id[ban_idx])) continue;
            list_id.push(user_id[i]);
            dfs(list_id, ban_idx + 1, cnt + 1);
            list_id.pop();
        }
    }
    dfs([], 0, 0);
    
    answer = new Set(list_all.map((list => list.sort().join("")))).size;
        
    return answer;
}

[ 코드 분석 ]

아이디가 일치하는 모든 경우의 수를 구하고, 중복되는 경우를 배제했을 때 문제에서 원하는 답이 도출된다.

 

matches의 패턴일치 확인을 위한 정규표현식 활용은 다양한 방면에 사용되니 숙지할 것

dfs에서 list_all.push() 부분에서 list_id 배열을 그냥 push하는 경우 추후 list_all에는 아무것도 남아있지 않음. dfs 에서 ist_id의 배열이 list_all 내부에 참조되어 같이 제거되어 이 부분에 깊은복사가 꼭 필요했다.

반응형
Comments