풀이
- 아이디의 최대가 최대 8개이기 때문에 조합으로 가능
- user id 중 banned id의 개수만큼 조합으로 고름
- banned id에 해당하는 경우만
 
- 최종적으로 고른 user id의 index를 stringbuilder로 이어붙임
- 어차피 한자리수*banned id개수니까 가능함
- 이어 붙인 문자열을 set에 넣음
- 해당 문자열이 set에 존재할 경우 0 반환 아닐경우 1 반환
 
비고
- 각각 다른 banned_id에 의해 걸렸더라도 제재아이디의 목록이 같으면 하나의 경우임
더보기
package KakaoIntern2019.P64064_불량사용자;
import java.util.HashSet;
public class Solution {
	static HashSet<String> set;
	static public int solution(String[] user_id, String[] banned_id) {
		int answer = 0;
		boolean[] use = new boolean[user_id.length];
		set = new HashSet<>();
		answer = dfs(0, user_id, banned_id, use);
		return answer;
	}
	private static int dfs(int depth, String[] user_id, String[] banned_id, boolean[] use) {
		if (depth == banned_id.length) {
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < use.length; i++) {
				if (use[i])
					sb.append(i);
			}
			if (set.contains(sb.toString()))
				return 0;
			set.add(sb.toString());
			return 1;
		}
		int result = 0;
		for (int i = 0; i < user_id.length; i++) {
			if (use[i] || !mask(banned_id[depth], user_id[i]))
				continue;
			use[i] = true;
			result += dfs(depth + 1, user_id, banned_id, use);
			use[i] = false;
		}
		return result;
	}
	private static boolean mask(String mask, String id) {
		if (mask.length() != id.length())
			return false;
		for (int i = 0; i < mask.length(); i++) {
			if (mask.charAt(i) == '*')
				continue;
			if (mask.charAt(i) != id.charAt(i))
				return false;
		}
		return true;
	}
	public static void main(String[] args) {
		String[] u = { "frodo", "fradi", "crodo", "abc123", "frodoc" };
		String[] b = { "*rodo", "*rodo", "******" };
		System.out.println(solution(u, b));
	}
}
'알고리즘왕 > Programmers' 카테고리의 다른 글
| [프로그래머스/JAVA] 수식 최대화 (0) | 2021.05.04 | 
|---|---|
| [프로그래머스/JAVA] 키패드 누르기 (0) | 2021.05.04 | 
| [프로그래머스/JAVA] 크레인 인형 뽑기 게임 (0) | 2021.05.03 | 
| [프로그래머스/42889/JAVA] 실패율 (0) | 2021.03.31 | 
| [프로그래머스/42890/JAVA] 후보키 (0) | 2021.03.29 |