본문으로 바로가기

programmers. 불량 사용자

category Algorithm/문제 2021. 5. 1. 22:13

문제

문제

 

코딩테스트 연습 - 불량 사용자

개발팀 내에서 이벤트 개발을 담당하고 있는 "무지"는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량

programmers.co.kr

풀이

처음엔 그냥 밴 된 아이디의 경우의 수를 구해서 곱하면 끝날 줄 알았는데

경우의 수가 워낙 들쑥날쑥해서 수학적인 계산으로는 안되겠구나 싶었다

그래서 무식하게 풀기로 했는데 밴 배열의 원소 하나에서 나올 수 있는 아이디를 배열로 가지는 배열..

설명이 너무 긴데 1번 예제를 예시로 들면 아래와 같은 배열이 나온다

[["frodo", "fradi"],[abc123]]

이 배열에서 경우의 수를 구하면 정답을 구할 수 있다

코드

// 폴리필
String.prototype.replaceAll = function(from, to) {
        if(from instanceof RegExp)
            if(!from.flags.includes)
                throw new TypeError("replaceAll must be called with a global RegExp")
            else
                return this.replace(from, to);
        else
            return this.replace(new RegExp(from.replace(/[\\^$*+?.():=!|{},\[\]]/g, "\\$&"), "g"), to);
};
    function solution(user_id, banned_id) {
        var answer = new Set();
        const regArr = banned_id.map(v=>[new RegExp(v.replaceAll('*','\\w')),v.length]);
        const arr = regArr.map(reg=> user_id.filter(id=> id.search(reg[0])===0 && id.length===reg[1]));

        const temp = [];


        dfs(0);

        console.log(answer)
        function dfs(index){
            if(temp.length===arr.length){
                const sorted = [...temp];

                answer.add(sorted.sort().join(''));
                return ;
            }

            for(let j=0; j<arr[index].length;j++){
                if(temp.includes(arr[index][j])) continue;
                temp.push(arr[index][j]);
                dfs(index+1);
                temp.pop();
            }
        }


        return answer.size;
    }

프로그래머스에서 replaceAll이 구현이 안되어있어서 에러가 나길래 구현하기 귀찮아서 폴리필 코드를 들고와서 붙여넣었다

'Algorithm > 문제' 카테고리의 다른 글

programmers. 길 찾기 게임  (0) 2021.05.04
programmers. 합승 택시 요금  (0) 2021.05.02
programmers. 보석 쇼핑  (0) 2021.04.30
programmers. 단속카메라  (0) 2021.04.26
programmers. 섬 연결하기  (0) 2021.04.26