π λ¬Έμ λ§ν¬
λΆλ μ¬μ©μ
μ½λ©ν
μ€νΈ μ°μ΅ - λΆλ μ¬μ©μ λ¬Έμ μ
λλ€.
π‘ λ¬Έμ νμ
user_idλ μλͺ¨μ μμ΄λ λͺ©λ‘μ΄κ³ ,banned_idλ λΆλ μ¬μ©μ μμ΄λ λͺ©λ‘μ΄λ€.banned_idμ*λ μ΄λ€ λ¬Έμλ ν κΈμμ λ§€μΉλλ€.banned_idμ κ° νλͺ©μλ μλ‘ λ€λ₯Έ μλͺ¨μ μμ΄λκ° νλμ© λμλμ΄μΌ νλ€.- μ μ¬ λμμ΄ λ μ μλ μμ΄λ μ‘°ν©μ μλ₯Ό ꡬνλ€. μμ΄λ λͺ©λ‘μ λ΄μ©μ΄ κ°μΌλ©΄ μμμ μκ΄μμ΄ κ°μ κ²½μ°λ‘ λ³Έλ€.
user_idλ μ΅λ 8κ°λΌ μμ νμμ΄ κ°λ₯νλ€.
ποΈ μ κ·Ό λ°©λ²
- κ°
banned_id[i]λ§λ€ λ§€μΉλλuser_idν보 리μ€νΈ(banList[i])λ₯Ό λ¨Όμ λ§λ λ€.- κΈΈμ΄κ° κ°κ³ ,
*κ° μλ μμΉμ λ¬Έμκ° λͺ¨λ κ°μΌλ©΄ λ§€μΉλλ€.
- κΈΈμ΄κ° κ°κ³ ,
- ν보 리μ€νΈλ₯Ό κ³±ν΄μ κ²½μ°μ μλ₯Ό ꡬνλ©΄
banned_idλΌλ¦¬ κ²ΉμΉλ νλ³΄κ° μμ λ μ€λ³΅μΌλ‘ μΈκ² λλ€. κ·Έλμ κ³±μ λμ DFS λ‘ μ‘°ν©μ μ§μ λ§λ λ€.idxλ²μ§Έbanned_idμ λν΄ ν보 μ€ μμ§ μ°μ§ μμ μμ΄λλ₯Ό νλ κ³ λ₯΄κ³ (isUsed), λ€μbanned_idλ‘ λμ΄κ°λ€.idx == lenμ΄ λλ©΄ νλμ μ‘°ν©μ΄ μμ±λ κ²μ΄λ€.
- κ°μ μμ΄λ μ§ν©μ΄ λ€λ₯Έ μμλ‘ λ§λ€μ΄μ§ μ μμΌλ―λ‘, μμ±λ μ‘°ν©μ μ λ ¬ν λ¬Έμμ΄λ‘ λ§λ€μ΄
Setμ λ£μ΄ μ€λ³΅μ μ κ±°νλ€.- μ΅μ’
λ΅μ
Setμ ν¬κΈ°λ€.
- μ΅μ’
λ΅μ
for (String bannedId : banList[idx]) {
if (isUsed.get(bannedId)) continue;
isUsed.put(bannedId, true);
dfs(idx + 1, str + "+" + bannedId);
isUsed.put(bannedId, false);
}
π§© μ½λ ꡬν
import java.util.*;
class Solution {
int len;
List<String>[] banList;
Set<String> answerSet = new HashSet<>();
Map<String, Boolean> isUsed = new HashMap<>();
public int solution(String[] user_id, String[] banned_id) {
len = banned_id.length;
banList = new List[banned_id.length];
for (int i = 0; i < len; i++) {
banList[i] = new ArrayList<>();
}
for (String userId : user_id) {
isUsed.put(userId, false);
}
for (int i = 0; i < len; ++i) {
for (String userId : user_id) {
if (isMatch(banned_id[i], userId)) banList[i].add(userId);
}
}
dfs(0, "");
return answerSet.size();
}
private void dfs(int idx, String str) {
if (idx == len) {
answerSet.add(sortById(str));
return;
}
for (String bannedId : banList[idx]) {
if (isUsed.get(bannedId)) continue;
isUsed.put(bannedId, true);
dfs(idx + 1, str + "+" + bannedId);
isUsed.put(bannedId, false);
}
}
private boolean isMatch(String bannedId, String userId) {
if (bannedId.length() != userId.length()) return false;
for (int i = 0; i < bannedId.length(); ++i) {
char b = bannedId.charAt(i);
char u = userId.charAt(i);
if (b != '*' && b != u) return false;
}
return true;
}
private String sortById(String str) {
String[] temp = str.split("\\+");
Arrays.sort(temp);
return String.join("+", temp);
}
}