Algorithm
[Algo] 프로그래머스 불량 사용자
조핑구
2024. 5. 9. 10:29
import java.util.*;
class Solution {
static boolean []check;
static String []user;
static String []ban;
static int userLen;
static int banLen;
static Set<List<Integer>> set=new HashSet<>();
public int solution(String[] user_id, String[] banned_id) {
userLen=user_id.length;
banLen=banned_id.length;
check=new boolean [userLen];
user=user_id;
ban=banned_id;
dfs(0);
return set.size();
}
public void dfs ( int banId){
if(banId>=banLen){
List<Integer> list=new ArrayList<>();
for(int i=0; i<userLen; i++){
if(check[i])
list.add(i);
}
set.add(list);
return;
}
if(ban[banId].equals("")){
dfs(banId+1);
return;
}
for(int i=0; i<userLen; i++){
if(!check[i]&&isBan(user[i], ban[banId])){
check[i]=true;
dfs(banId+1);
check[i]=false;
}
}
}
public boolean isBan(String u, String b){
if(u.length()!=b.length()) return false;
for(int i=0; i<u.length(); i++){
if(b.charAt(i) == '*') continue;
else if(u.charAt(i)!=b.charAt(i)) return false;
}
return true;
}
}
문자열의 길이가 8이고 배열의 길이도 8인것을 보아 모든 조합을 시도해 보는 문제임을 알 수 있다. 여기서 까다로운 점은 순서 상관없이 내용이 같은 밴유저 조합은 하나로 계산한다는 것이다. 따라서 밴유저 조합을 만든 다음, 그 조합이 중복되지 않도록 관리해야한다. 여기서는 list에 유저를 넣은 다음, 해당 유저 list가 중복으로 저장되지 않게 set에 저장한다.