algorithm/프로그래머스
[프로그래머스] 불량 사용자 (08.04)
자바왕세자
2020. 8. 4. 18:05
문제
https://programmers.co.kr/learn/courses/30/lessons/64064
코딩테스트 연습 - 불량 사용자
개발팀 내에서 이벤트 개발을 담당하고 있는 무지는 최근 진행된 카카오이모티콘 이벤트에 비정상적인 방법으로 당첨을 시도한 응모자들을 발견하였습니다. 이런 응모자들을 따로 모아 불량 ��
programmers.co.kr
접근법
응모자 아이디를 돌면서 불량 사용자의 아이디와 일치하는 경우를 찾았다.
dfs를 사용했다.
문자열을 비교하는 것은 정규표현식을 사용하였다.
중요한 포인트는 중복되는 경우들을 어떻게 처리하느냐였다.
시간이 좀 걸릴 것을 알았지만 데이터가 적었기 때문에 가능한 조합을 오름차순으로 나열해서 set에 넣었다
그러면 crodo frodo 가 되던 frodo crodo가 되던 정렬을 하게 되면 "crodo frodo"가 되기 때문에 중복 체크를 할 수 있다.
코드
import java.util.*;
class Solution {
private boolean[] visited;
private Set<String> set = new HashSet<>();
public int solution(String[] user_id, String[] banned_id) {
visited = new boolean[user_id.length];
dfs(0, "", user_id, banned_id);
return set.size();
}
private void dfs(int n, String str, String[] user_id, String[] banned_id) {
if(n == banned_id.length){
String[] strArr = str.split(" ");
Arrays.sort(strArr);
StringBuilder sb = new StringBuilder();
for(String s : strArr){
sb.append(s);
}
set.add(sb.toString());
return;
}
String reg = banned_id[n].replace("*", "[\\w\\d]");
for(int i=0;i< user_id.length;i++){
if(user_id[i].matches(reg) && !visited[i]){
visited[i] =true;
dfs(n+1, str+ " " +user_id[i], user_id, banned_id);
visited[i] = false;
}
}
}
}