프로그래머스 불량 사용자 (Java,자바)

jonghyukLee·2022년 5월 2일
0

이번에 풀어본 문제는
프로그래머스 불량 사용자 입니다.

📕 문제 링크

❗️코드

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의 크기를 구했을 때, 중복을 배제한 크기를 구할 수 있게 됩니다.

📜 후기

해결이 쉽게 되지 않아 풀이를 참고했습니다. 문자열을 변경하여 정규식을 적용할 생각은 전혀 못했는데.. 참 기발한 것 같네요ㅠ

profile
머무르지 않기!

0개의 댓글