Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 코딩 테스트
- Dxerr.h
- 백준
- springboot
- 10830번
- 17장
- java의 정석
- DxTrace
- 가장 긴 증가하는 부분 수열2
- 9장
- 냄새와 휴리스틱
- 코딩테스트
- 클린코드
- 1043번
- SerialDate 리펙터링
- Design Pattern
- 11758번
- 2156번
- 자바의 정석
- 11286번
- 2166번
- 1300번
- 2206번
- Adapater Pattern
- java
- programmers
- Spring
- BOJ
- Design Patterns
- 프로그래머스
Archives
- Today
- Total
Don't give up!
[프로그래머스] 불량 사용자 (java) 본문
코딩테스트 연습 - 불량 사용자 | 프로그래머스 (programmers.co.kr)
어떻게 생각하고 문제를 풀었는가?
불량 사용자 아이디의 탐색은 길이가 같아야 합니다.
*문자를 0~9, a~z의 문자 탐색이 가능하도록 정규표현식 \w로 변경하여 문자의 탐색을 수행하여 일치하는 아이디들을 찾을 수 있습니다.
주어진 조건에서 순서에 상관없이 아이디 목록이 동일하다면 동일한 케이스로 인식됩니다.
이를 해결하고자 중복을 방지하는 HashSet에 주어진 문자열 배열에서 어떤 아이디를 선택했는지 저장하고자 하였습니다.
코드
import java.util.*;
class Solution {
String[] regex;
HashSet<Integer> set = new HashSet<>();
public int solution(String[] user_id, String[] banned_id) {
regex = new String[banned_id.length];
for(int i=0; i<banned_id.length; i++){
regex[i] = banned_id[i].replace("*", "[\\w]");
}
dfs(0,user_id,0);
return set.size();
}
void dfs(int index, String[] user_id, int bit){
if(index==regex.length){
set.add(bit);
return;
}
for(int i=0; i<user_id.length; ++i) {
if((((bit>>i) & 1) != 1) && user_id[i].matches(regex[index])){
dfs(index+1, user_id, bit|1<<i);
}
}
}
}
주어지는 user_id의 크기를 확인하지 않고 어떤 아이디가 사용되었는지 기억하고자 bitmasking을 활용하였습니다.
해당 아이디를 사용했다면 user_id의 인덱스위치에 있는 bit값을 1로 변경함으로써 어떤 인덱스의 아이디를 선택했는지 기억할 수 있고, 모든 불량 사용자 정보에 대해 선택이 이루어졌다면 bit조합을 HashSet에 저장함으로써 중복 없는 모든 경우를 확인할 수 있습니다.
'Coding Test > Programmers' 카테고리의 다른 글
[프로그래머스] 추석 트래픽 (java) (0) | 2021.06.25 |
---|---|
[프로그래머스] N-Queen (java) (0) | 2021.06.23 |
[프로그래머스] 보석 쇼핑 (java) (0) | 2021.06.22 |