[JS][프로그래머스 -LEVEL 3 - 불량사용자]

정대만·2023년 9월 5일

코딩테스트

목록 보기
42/51
post-thumbnail

이런식으로 banned_id에 맞는 형식인 아이디 찾아서 조합으로 만든다.
이때 중복된게 있으면 안된다.

  • 여기서 중복된거 거르는데 시간을 많이 써서 찾아보니.. 그냥 set 으로 구분하는거였다...
  • 데이터 양이 별로 없어서 그래도 되는가 싶다.

다른 사람들 코드 보니까 처음부터
'fr^d^':[ ] 이런식으로 obj 분류안하고 그냥 정규표현식만 구한뒤바로 dfs 구하는것을 보았다. .

다른 사람 코드

function solution(user_id, banned_id) {
    const selected = Array(user_id.length).fill(false);
    const regex = banned_id.map(id => new RegExp(`^${id.replaceAll('*', '.')}$`));
    const set = new Set();
    
    const dfs = (index = 0, arr = []) => {
        if (index === banned_id.length) {
            set.add(arr.sort().join(','));
        } else {
            for (let i = 0; i < user_id.length; i++) {
                if (selected[i]) {
                    continue;
                }
                
                if (user_id[i].match(regex[index])) {
                    selected[i] = true;
                    dfs(index + 1, [...arr, user_id[i]]);
                    selected[i] = false;
                }
            }
        }
    };
    
    dfs();
    
    return set.size;
}
  • dfs 으로 식을 푸는데 처음부터 banned_id 의 아이디를 정규식으로 만든다.
  • dfs 통해서 end 값을 지정해준뒤 .regex[index] 값을 올리면서 찾아야하는 아이디를 찾는다.
  • 이때 이미 넣은 아이디 인 경우 selected[i] = true을 넣어서 다시 못넣게 한다.

나는 dfs 니까 무조건 2차배열로 풀어야 되겠다 생각을 했는데 그건 아닌듯하다....!!

function solution(user_id, banned_id) {
    var answer = 0;
    const str= function(stt){
        var new_str=stt.replaceAll('*','[a-z0-9]');
        return new_str;
    }
  var obj={};
     const set = new Set();
    
    for(var i=0; i<banned_id.length; i++){
         
      
        var hey=  new RegExp(`${str(banned_id[i]) }`)
        for(var zz=0; zz<user_id.length; zz++){
       if(banned_id[i].length== user_id[zz].length 
              && hey.test(user_id[zz])
              ){
                if(!obj[banned_id[i]]){
                    obj[banned_id[i]]=[user_id[zz]]
                } 
                else{
                    if(obj[banned_id[i]].includes(user_id[zz])==false){   
                    obj[banned_id[i]].push(user_id[zz]);
                    }
                    
                }
            }
        }
     
        
    }

 


    const dfs= function(ima,arrr,banned_id){
     
        if(ima>=banned_id.length){
            var new__=arrr.slice()
            //여기서 복사하는 이유 !! 가장 중요하다. 얕은 복사를 안하고 바로 set 에 넣으면 정렬된 arrr이 
            //이전 ima-=1 에도 영향을 미쳐서 값이 완전 이상하게 나온다. 따라서 얕은 복사후 정렬안된것을 
            // 넘겨야 한다.
           set.add(new__.sort().join(','));
            return;
        }
        for(var go=0; go< obj[banned_id[ima]].length; go++){
        
            if(arrr.includes(obj[banned_id[ima]][go])
              )
            {
             
                continue;
            }
            else{
                arrr.push(obj[banned_id[ima]][go]);
              
                dfs(ima+1, arrr,banned_id);
            
                arrr.pop();
            
            }
        }
       
        
        
    }

    dfs(0,[],banned_id);
    
   return set.size;
}

배운거

  • 정규식 test 다시 알기
  • 틀린부분 왜 안되나 고민 한시간 한거..? ㅋㅋㅋㅋㅋㅋ
profile
안녕하세요

0개의 댓글