Level 3-1 ( 1)불량 사용자 )
### 2022.10.18. 화
1) 불량 사용자 (48%)
=> 풀다 말음..,
=> 직접 해결 못함!
① 참고링크
[프로그래머스/64064] 불량 사용자 (Java)
프로그래머스 64064 불량 사용자 Java DFS, 문자열
velog.io
② 관련 내용들 Check
* 관련 내용s
1. java 정규식
- 참고링크
https://hbase.tistory.com/160
[Java] 정규표현식 사용법 및 예제 - Pattern, Matcher
자바에서 정규표현식(Regular Expression)'을 사용해보자. 1. 정규표현식(Regular Expression) 정규표현식 혹은 정규식은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용되는 언어다. 정규 표현식은
hbase.tistory.com
2. java HashSet
- 참고링크
https://crazykim2.tistory.com/474
3. 재귀함수 호출 로직
- 참고링크1
https://codechasseur.tistory.com/30
- 참고링크2
https://tyeolrik.github.io/data_structure/2017/01/21/6-basic-understanding-of-recursion.html
! 피보나치 수열 호출 흐름

③ 코드



↓↓↓ 코드 복.붙
import java.util.*;
//import java.util.ArrayList;
//import java.util.HashSet;
import java.util.regex.Pattern;
class Solution {
// 전역변수 선언
HashSet<HashSet<String>> result;
ArrayList<ArrayList<String>> bannedUserList;
// 1.Main 함수
public int solution(String[] user_id, String[] banned_id) {
result = new HashSet<HashSet<String>>();
bannedUserList = new ArrayList<ArrayList<String>>();
System.out.println("1.banned_id:::" + Arrays.toString(banned_id));
System.out.println("2.user_id:::" + Arrays.toString(user_id));
for (String bannedId : banned_id) {
// 목록의 n번째 칸에 들갈 수 있는 제재 아이디들 구함
bannedUserList.add(getMatchesId(bannedId, user_id));
}
System.out.println("3.bannedUserList:::" + Arrays.deepToString(bannedUserList.toArray()));
dfs(new HashSet<String>(), 0);
System.out.println("5.result:::" + Arrays.deepToString(result.toArray()));
//int answer = 0;
return result.size();
}
// 2.정규식으로 banned_id 패턴 일치 user_id list 추출
public ArrayList<String> getMatchesId(String bannedId, String[] user_id) {
// 불량 사용자 아이디 정규 표현식으로 변환
// 정규 표현식에서 '.' = 임의의 문자열 1개
String pattern = bannedId.replace('*', '.');
System.out.println("pattern:::" + pattern);
ArrayList<String> valueList = new ArrayList<>();
for (String userId : user_id) {
boolean isMatch = Pattern.matches(pattern, userId);
// 정규 표현식 턴에 맞는 유저 아이디 담음
if(isMatch){
valueList.add(userId);
}
}
return valueList;
}
// 3.user_id 경우의 수 추출 # 호출 : dfs(new HashSet<String>(), 0);
public void dfs(HashSet<String> add, int depth) {
System.out.println("depth:::"+depth);
if (depth == bannedUserList.size()) {
// 결과 Set에 저장
result.add(new HashSet<>(add));
//System.out.println("5.result:::" + Arrays.deepToString(result.toArray()));
return;
}
// depth번째에 들어갈 수 있는 아이디 목록에서 뽑음
for (String userId : bannedUserList.get(depth)) {
System.out.println("userId(방문전):::"+userId);
// 이미 목록에 들어가있으면 담지 않음
if (!add.contains(userId)) {
add.add(userId);
dfs(add, depth + 1);
System.out.println("userId(방문후):::"+userId);
add.remove(userId);
System.out.println("add(방문후):::"+Arrays.deepToString(add.toArray()));
}
}
System.out.println("4.add(abc123):::" + Arrays.deepToString(add.toArray()));
//System.out.println("3.bannedUserList:::" + Arrays.deepToString(add.toArray()));
}
}
↓↓↓ 디버깅!
★☆★ 테스트 1 ★☆★
입력값 〉 ["frodo", "fradi", "crodo", "abc123", "frodoc"], ["fr*d*", "abc1**"]
기댓값 〉 2
실행 결과 〉 테스트를 통과하였습니다.
출력 〉
1.banned_id:::[fr*d*, abc1**]
2.user_id:::[frodo, fradi, crodo, abc123, frodoc]
pattern:::fr.d.
pattern:::abc1..
3.bannedUserList:::[[frodo, fradi], [abc123]]
depth:::0
userId(방문전):::frodo
depth:::1
userId(방문전):::abc123
depth:::2
userId(방문후):::abc123
add(방문후):::[frodo]
4.add(abc123):::[frodo]
userId(방문후):::frodo
add(방문후):::[]
userId(방문전):::fradi
depth:::1
userId(방문전):::abc123
depth:::2
userId(방문후):::abc123
add(방문후):::[fradi]
4.add(abc123):::[fradi]
userId(방문후):::fradi
add(방문후):::[]
4.add(abc123):::[]
5.result:::[[fradi, abc123], [abc123, frodo]]
★☆★ 테스트 2 ★☆★
입력값 〉 ["frodo", "fradi", "crodo", "abc123", "frodoc"], ["*rodo", "*rodo", "******"]
기댓값 〉 2
실행 결과 〉 테스트를 통과하였습니다.
출력 〉
1.banned_id:::[*rodo, *rodo, ******]
2.user_id:::[frodo, fradi, crodo, abc123, frodoc]
pattern:::.rodo
pattern:::.rodo
pattern:::......
3.bannedUserList:::[[frodo, crodo], [frodo, crodo], [abc123, frodoc]]
depth:::0
userId(방문전):::frodo
depth:::1
userId(방문전):::frodo
userId(방문전):::crodo
depth:::2
userId(방문전):::abc123
depth:::3
userId(방문후):::abc123
add(방문후):::[crodo, frodo]
userId(방문전):::frodoc
depth:::3
userId(방문후):::frodoc
add(방문후):::[crodo, frodo]
4.add(abc123):::[crodo, frodo]
userId(방문후):::crodo
add(방문후):::[frodo]
4.add(abc123):::[frodo]
userId(방문후):::frodo
add(방문후):::[]
userId(방문전):::crodo
depth:::1
userId(방문전):::frodo
depth:::2
userId(방문전):::abc123
depth:::3
userId(방문후):::abc123
add(방문후):::[crodo, frodo]
userId(방문전):::frodoc
depth:::3
userId(방문후):::frodoc
add(방문후):::[crodo, frodo]
4.add(abc123):::[crodo, frodo]
userId(방문후):::frodo
add(방문후):::[crodo]
userId(방문전):::crodo
4.add(abc123):::[crodo]
userId(방문후):::crodo
add(방문후):::[]
4.add(abc123):::[]
5.result:::[[crodo, frodo, frodoc], [crodo, abc123, frodo]]
★☆★ 테스트 3 ★☆★
입력값 〉 ["frodo", "fradi", "crodo", "abc123", "frodoc"], ["fr*d*", "*rodo", "******", "******"]
기댓값 〉 3
실행 결과 〉 테스트를 통과하였습니다.
출력 〉
1.banned_id:::[fr*d*, *rodo, ******, ******]
2.user_id:::[frodo, fradi, crodo, abc123, frodoc]
pattern:::fr.d.
pattern:::.rodo
pattern:::......
pattern:::......
3.bannedUserList:::[[frodo, fradi], [frodo, crodo], [abc123, frodoc], [abc123, frodoc]]
depth:::0
userId(방문전):::frodo
depth:::1
userId(방문전):::frodo
userId(방문전):::crodo
depth:::2
userId(방문전):::abc123
depth:::3
userId(방문전):::abc123
userId(방문전):::frodoc
depth:::4
userId(방문후):::frodoc
add(방문후):::[crodo, abc123, frodo]
4.add(abc123):::[crodo, abc123, frodo]
userId(방문후):::abc123
add(방문후):::[crodo, frodo]
userId(방문전):::frodoc
depth:::3
userId(방문전):::abc123
depth:::4
userId(방문후):::abc123
add(방문후):::[crodo, frodo, frodoc]
userId(방문전):::frodoc
4.add(abc123):::[crodo, frodo, frodoc]
userId(방문후):::frodoc
add(방문후):::[crodo, frodo]
4.add(abc123):::[crodo, frodo]
userId(방문후):::crodo
add(방문후):::[frodo]
4.add(abc123):::[frodo]
userId(방문후):::frodo
add(방문후):::[]
userId(방문전):::fradi
depth:::1
userId(방문전):::frodo
depth:::2
userId(방문전):::abc123
depth:::3
userId(방문전):::abc123
userId(방문전):::frodoc
depth:::4
userId(방문후):::frodoc
add(방문후):::[fradi, abc123, frodo]
4.add(abc123):::[fradi, abc123, frodo]
userId(방문후):::abc123
add(방문후):::[fradi, frodo]
userId(방문전):::frodoc
depth:::3
userId(방문전):::abc123
depth:::4
userId(방문후):::abc123
add(방문후):::[fradi, frodo, frodoc]
userId(방문전):::frodoc
4.add(abc123):::[fradi, frodo, frodoc]
userId(방문후):::frodoc
add(방문후):::[fradi, frodo]
4.add(abc123):::[fradi, frodo]
userId(방문후):::frodo
add(방문후):::[fradi]
userId(방문전):::crodo
depth:::2
userId(방문전):::abc123
depth:::3
userId(방문전):::abc123
userId(방문전):::frodoc
depth:::4
userId(방문후):::frodoc
add(방문후):::[crodo, fradi, abc123]
4.add(abc123):::[crodo, fradi, abc123]
userId(방문후):::abc123
add(방문후):::[crodo, fradi]
userId(방문전):::frodoc
depth:::3
userId(방문전):::abc123
depth:::4
userId(방문후):::abc123
add(방문후):::[crodo, fradi, frodoc]
userId(방문전):::frodoc
4.add(abc123):::[crodo, fradi, frodoc]
userId(방문후):::frodoc
add(방문후):::[crodo, fradi]
4.add(abc123):::[crodo, fradi]
userId(방문후):::crodo
add(방문후):::[fradi]
4.add(abc123):::[fradi]
userId(방문후):::fradi
add(방문후):::[]
4.add(abc123):::[]
5.result:::[[crodo, abc123, frodo, frodoc], [crodo, fradi, abc123, frodoc], [fradi, abc123, frodo, frodoc]]
★☆★ 테스트 4 ★☆★
입력값 〉 ["frodo", "fradi", "crodo", "abc123", "frodoc"], ["*rodo", "*rodo", "******", "******"]
기댓값 〉 1
실행 결과 〉 테스트를 통과하였습니다.
출력 〉
1.banned_id:::[*rodo, *rodo, ******, ******]
2.user_id:::[frodo, fradi, crodo, abc123, frodoc]
pattern:::.rodo
pattern:::.rodo
pattern:::......
pattern:::......
3.bannedUserList:::[[frodo, crodo], [frodo, crodo], [abc123, frodoc], [abc123, frodoc]]
depth:::0
userId(방문전):::frodo
depth:::1
userId(방문전):::frodo
userId(방문전):::crodo
depth:::2
userId(방문전):::abc123
depth:::3
userId(방문전):::abc123
userId(방문전):::frodoc
depth:::4
userId(방문후):::frodoc
add(방문후):::[crodo, abc123, frodo]
4.add(abc123):::[crodo, abc123, frodo]
userId(방문후):::abc123
add(방문후):::[crodo, frodo]
userId(방문전):::frodoc
depth:::3
userId(방문전):::abc123
depth:::4
userId(방문후):::abc123
add(방문후):::[crodo, frodo, frodoc]
userId(방문전):::frodoc
4.add(abc123):::[crodo, frodo, frodoc]
userId(방문후):::frodoc
add(방문후):::[crodo, frodo]
4.add(abc123):::[crodo, frodo]
userId(방문후):::crodo
add(방문후):::[frodo]
4.add(abc123):::[frodo]
userId(방문후):::frodo
add(방문후):::[]
userId(방문전):::crodo
depth:::1
userId(방문전):::frodo
depth:::2
userId(방문전):::abc123
depth:::3
userId(방문전):::abc123
userId(방문전):::frodoc
depth:::4
userId(방문후):::frodoc
add(방문후):::[crodo, abc123, frodo]
4.add(abc123):::[crodo, abc123, frodo]
userId(방문후):::abc123
add(방문후):::[crodo, frodo]
userId(방문전):::frodoc
depth:::3
userId(방문전):::abc123
depth:::4
userId(방문후):::abc123
add(방문후):::[crodo, frodo, frodoc]
userId(방문전):::frodoc
4.add(abc123):::[crodo, frodo, frodoc]
userId(방문후):::frodoc
add(방문후):::[crodo, frodo]
4.add(abc123):::[crodo, frodo]
userId(방문후):::frodo
add(방문후):::[crodo]
userId(방문전):::crodo
4.add(abc123):::[crodo]
userId(방문후):::crodo
add(방문후):::[]
4.add(abc123):::[]
5.result:::[[crodo, abc123, frodo, frodoc]]
④ Review
- 문제 구조도 그려보기!
: heap, stack, 전역변수 선언시 저장 공간?
- 다른 테스트 케이스 디버깅 더 해보기!
- 불량사용자 permutation(순열)으로 풀면??? (수학적 접근)
### 2022.10.24. 월
2) 이중우선순위큐 (60%)
① 사용 알고리즘 : 이중 우선순위 큐
3) 야근지수 (57%)
① 사용 알고리즘 : 이중 우선순위 큐
→ 2), 3) 해당 링크
https://checkit3625.tistory.com/entry/Level-3-2
Level 3-2 ( 1)이중우선순위큐 2)야근 지수 )
### 2022.10.26. 수 1) 이중우선순위큐 (60%) ① 사용 알고리즘 : 이중 우선순위 큐 ② 참고 링크 - 우선순위 큐 직접 구현 https://hongjw1938.tistory.com/22 자료구조 - 우선순위 큐(Heap, Priority Queue) 1. 우선순위
checkit3625.tistory.com
* 효율성?
코드 짤 때 어느게 더 효율적일까?
- if (조건A && 조건B) { 실행 코드... }
=> 조건A, 조건 B 둘다 참이어야 실행되므로 조건A에 거짓을..,
- if (조건A || 조건B) { 실행 코드... }
=> 둘 중에 하나만 참이면 실행되므로 조건 A에 참을..,
'이직준비 > 목표1_코테1(2210)' 카테고리의 다른 글
Level 3-4 (Review) (0) | 2022.11.09 |
---|---|
Level 3-2 ( 1)이중우선순위큐 2)야근 지수 ) (0) | 2022.11.09 |
Level 2 (1) | 2022.10.18 |
Level 1 (0) | 2022.10.18 |
Level 0 (0) | 2022.10.18 |