[프로그래머스] 불량 사용자

2020. 4. 22. 14:45프로그래머스/카카오

import java.util.*;

class Solution {
    int answer;
    List<ArrayList> list = new ArrayList<>();
    
    public int solution(String[] user_id, String[] banned_id) {
        
        boolean[] visited = new boolean[user_id.length];
        dfs(user_id,banned_id,0,0,visited);
        
        return answer;
    }
    
    private void dfs(String[] user_id, String[] banned_id, int index, int checkIdNumber, boolean[] visited) {
        if (checkIdNumber == banned_id.length) { //banned_id에 해당되는 수만큼 맵핑했다면 
            ArrayList<String> temp = new ArrayList<>();
            for(int i=0; i<visited.length; i++){
                if(visited[i]){
                    temp.add(user_id[i]);
                }
            }
            
            int cnt =0;
            for(int i=0; i<list.size(); i++){
                ArrayList<String> imsi = list.get(i);
                boolean flag = false;
                for(int j=0; j<temp.size(); j++){
                    if(!temp.contains(imsi.get(j))){
                        flag = true;
                    }
                }
                if(flag == true){
                    cnt++;
                }
            }
            if(cnt == list.size()){
                list.add(temp);
                answer++;
            }
            return;
        }
        
        for (int i=0; i<user_id.length; i++) {
            
            if(compareBan(user_id[i],banned_id[index])) {
                if(!visited[i]){
                    visited[i] = true;
                    dfs(user_id,banned_id, index+1, checkIdNumber+1,visited);
                    visited[i] = false;
                }
            }
        }
    }
    
     private boolean compareBan(String user, String ban) {
        List<Integer> starLocation = new LinkedList<>();
        StringBuilder s = new StringBuilder(user);
         
        if(user.length()!=ban.length()){
            return false;
        }else{
            for(int i=0; i<ban.length(); i++){
                if(ban.charAt(i)=='*'){
                    starLocation.add(i);
                }
            }
            for(int i=0; i<starLocation.size(); i++){
                s.setCharAt(starLocation.get(i),'*');
            }
        }
        
        if(s.toString().equals(ban)){
            return true;
        }else{
            return false;
        }
        
    }
   
}

DFS를 통한 완전탐색을 한 것인데 코드가 많이 복잡한 것 같다.

좀더 깔끔하게 짜보도록 해야겠다.