FrontEnd/프로그래머스

[JS] 불량 사용자

728x90

정규표현식과 set , dfs 를 활용하여 해결한 문제였다.

 

https://school.programmers.co.kr/learn/courses/30/lessons/64064

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

정규표현식은 불량 사용자인지 아닌지를 가져오기 위해서 사용했는데 굳이 정규표현식이 아닌 반복문을 활용해서 풀었어도 상관은 없을 문제인듯 하다.

 

1. 정규표현식으로 banned_id마다 가능한 아이디의 조합을 가져오기

 

EX) TEST CASE 3

[
[ 'frodo', 'fradi' ],
[ 'frodo', 'crodo' ],
[ 'abc123', 'frodoc' ],
[ 'abc123', 'frodoc' ]
]

 

2. dfs를 활용하여 만들 수 있는 조합 만들기

한번 사용한 이름은 사용할 수 없으므로 객체를 하나 만들어서 중복이 안들어가는 조합들을 만들었다.

 

3. 중복 제거

set을 활용해서 만들어둔 조합 중 순서만 다른것들을 삭제해주었다.

-> 배열에 이름조합들을 넣을때 문자가 아닌 숫자로 넣어주었다.

-> user_id의 순서대로 불량사용자로 뽑힌 사용자를 1로 바꿔주는식

 

EX ) TEST CASE 3

 

user_id -> ["frodo", "fradi", "crodo", "abc123", "frodoc"] -> 00000이라 생각

 

'frodo','crodo','abc123','frodoc' -> 10111

'frodo','crodo','frodoc','abc123' -> 10111

 

위와 같은 방식으로 중복된 값들을 제거해주었다.

 

 

 

 

function solution(user_id, banned_id) {
    const bannedIdList = banned_id.map(v => {
        const reg = new RegExp('^'+[...v].map(v => v==='*' ? '.' : v).join('')+'$')
        return user_id.filter(v => reg.test(v))
    })
    
    let ret = []
    const obj = {}
    for (const user of user_id){
        obj[user] = false
    }
    
    const dfs = (depth) => {
        if (depth === banned_id.length){
            const tmp = Array(user_id.length).fill(0)
            for (const [user,val] of Object.entries(obj)){
                if(val) tmp[user_id.indexOf(user)] = 1
            }
            ret.push(tmp.join(''))
            return
        }
        
        for (const id of bannedIdList[depth]){
            if (obj[id]) continue
            obj[id] = true
            dfs(depth+1)
            obj[id] = false
        }
    }
    
    dfs(0)
    return new Set(ret).size
}
728x90

'FrontEnd > 프로그래머스' 카테고리의 다른 글

[JS] 블록 이동하기  (0) 2023.12.20
[JS] 징검다리 건너기  (0) 2023.12.19
[JS] [카카오인턴] 보석 쇼핑  (1) 2023.12.17
[JS] 경주로 건설  (0) 2023.12.16
[JS] 풍선 터트리기  (0) 2023.12.15