불량 사용자 : https://programmers.co.kr/learn/courses/30/lessons/64064
분명 비슷한 유형의 문제를 풀어봤는데 생각 못했던게 속상했던 문제.
백트래킹과 문자열의 matches를 이용하여 조건에 맞는 아이디 조합을 문자열로 만들어 비교하여 해결했다.
문제 풀이 순서는 아래와 같다.
matches
를 활용해 아이디 조합 문자열을 만들어간다.HashSet
을 이용해 중복 조합을 제거하여 저장한다.import java.util.HashMap;
import java.util.HashSet;
import java.util.Arrays;
class Solution {
HashSet<String> set;
String[] userList;
String[] banList;
boolean[] visit;
public int solution(String[] user_id, String[] banned_id) {
set = new HashSet<>();
visit = new boolean[user_id.length];
//*문자를 .으로 치환
for(int i=0;i<banned_id.length;i++){
banned_id[i] = banned_id[i].replace("*",".");
}
userList = user_id;
banList = banned_id;
//문자열 조합 생성
setList(0, "");
return set.size();
}
//문자열 조합 생성 함수
//idx : 비교문자열 index, id : 아이디 조합 문자열
void setList(int idx, String id){
//아이디 조합 문자열을 완성시켰다면
//중복 문자열을 방지하기 위해 정렬 후 hashSet에 저장
if(idx == banList.length){
String[] splitId = id.split(" ");
Arrays.sort(splitId);
StringBuilder sb = new StringBuilder();
for(String i : splitId){
sb.append(i);
}
set.add(sb.toString());
return;
}
//백트래킹을 이용하여
//사용되지 않은 아이디와 비교 문자열을 matches로 비교하여 아이디 조합을 생성해나간다.
for(int i=0;i<userList.length;i++){
if(userList[i].matches(banList[idx]) && !visit[i]){
visit[i] = true;
setList(idx+1, id+ " "+userList[i]);
visit[i] = false;
}
}
}
}
처음에는 *문자열과 관련된 문제인거 보고 문제도 제대로 안 읽고 바로 Map에 재귀함수 사용해서 모든 경우의 수를 구하고 해당 문자열의 갯수를 구해놨다. 멍청한 짓을 참 자주하는것 같다.
문자열에서 matches함수를 처음 사용해봤고 문자열 문제를 풀때 시간복잡도에 유의하면서 사용하면 유용하게 사용할수 있을것 같다.
https://moonsbeen.tistory.com/45
https://codechacha.com/ko/java-string-matches/