이번에 풀어본 문제는
프로그래머스 불량 사용자 입니다.
import java.util.*;
import java.util.regex.Pattern;
class Solution {
static List<List<String>> bannedId;
static Set<Set<String>> result;
static int userCnt,bannedCnt;
public int solution(String[] user_id, String[] banned_id) {
userCnt = user_id.length;
bannedCnt = banned_id.length;
bannedId = new ArrayList<>();
result = new HashSet<>();
for(String id : banned_id) bannedId.add(getIdList(user_id,id));
dfs(0,new HashSet<>());
return result.size();
}
static List<String> getIdList(String [] user_id,String id)
{
String pattern = id.replace('*','.');
List<String> res = new ArrayList<>();
for(String next : user_id)
{
if(Pattern.matches(pattern,next)) res.add(next);
}
return res;
}
static void dfs(int depth, Set<String> tmpSet)
{
if(depth == bannedCnt)
{
result.add(new HashSet<>(tmpSet));
return;
}
for(String bannedId : bannedId.get(depth)) {
if(!tmpSet.contains(bannedId))
{
tmpSet.add(bannedId);
dfs(depth+1,tmpSet);
tmpSet.remove(bannedId);
}
}
}
}
아이디의 일부가 가려진 banned_id 배열이 주어졌을 때, user_id로 조합할 수 있는 모든 경우의 수를 구하는 문제입니다. 중복은 카운트하지 않습니다.
정규식을 활용하여 banned_id 배열의 값과 user_id값을 비교해, 가능한 아이디를 bannedId 리스트에 담아줍니다.
dfs 탐색을 진행하면서 tmpSet에 생성된 조합을 result에 담아주면, 최종적으로 result의 크기를 구했을 때, 중복을 배제한 크기를 구할 수 있게 됩니다.
해결이 쉽게 되지 않아 풀이를 참고했습니다. 문자열을 변경하여 정규식을 적용할 생각은 전혀 못했는데.. 참 기발한 것 같네요ㅠ