반응형
처음 문제를 접했을 때 설계에 상당히 많은 시간을 사용하였다.
단순 문자열 파싱 문제인지 알았는데, 자세히 보니 전혀 다른 문제였다. 출력의 경우의 수를 자세히 보다 보니 특정한 규칙을 찾게 되었다. 이차원 배열이 있고, 가로축을 user_id, 세로축을 banned_id라고 하고 패턴이 매칭되면 1을 둔다고 가정한다면, 맨처음 입력 예시에선 다음과 같이 적용이 된다.
"frodo" "fradi" "crodo" "abc123" "frodoc"
"fro*d*" 1 1 0 0 0
"abc1**" 0 0 0 1 0
이에 따른 출력은 2가지 경우로 frodo, abc123 과 fradi, abc123 가 나오게 된다.
여기서 찾은 규칙은 패턴이 매칭되는 1에 한해서 각행마다 하나의 열을 선택하게 되고, 다음행에선 선택이 안된 열에 대해 선택이 가능하다는 규칙을 찾게 되었다. 즉, N-Queen과 비슷한 원리의 백트래킹 문제로 생각하여 풀어보았다.
백트래킹을 사용하여 마지막 행까지 추적해보니 결과값을 얻을 수 있었다. 다만, 주의할점이 하나 있었는데 중복이 되는 해에대해선 1나로 카운팅을 해준다는 점이었다. 그래서 set을 이용하였고, set중에서도 가장 속도가 빠른 hashSet을 사용하여 최종 결과를 얻을 수 있었다.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
package programmers;
import java.util.HashSet;
import java.util.Set;
public class Solution_2019카카오겨울_불량사용자 {
public static void main(String[] args) {
String[] user_id= {"frodo", "fradi", "crodo", "abc123", "frodoc"};
// String[] banned_id= {"fr*d*", "abc1**"};
// String[] banned_id= {"*rodo", "*rodo", "******"};
String[] banned_id= {"fr*d*", "*rodo", "******", "******"};
System.out.println(solution(user_id,banned_id));
}
static int[][] map;
static boolean[] visit;
static Set<String> set;
static int R,C;
static int solution(String[] user_id, String[] banned_id) {
R=banned_id.length;
C=user_id.length;
map=new int[R][C];
for(int i=0;i<R;i++) {
for(int j=0;j<C;j++) {
String ban=banned_id[i];
String user=user_id[j];
if(user.length() == ban.length()) { //길이가 같다면 확인
boolean flag=true;
for(int index=0;index<user.length()&&flag;index++) {
if(ban.charAt(index)!='*' && (ban.charAt(index)!=user.charAt(index)))
flag=false;
}
map[i][j]=flag?1:0; //카운팅
}
}
}
visit=new boolean[C];
// for(int i=0;i<C;i++) {
// if(map[0][i]==1) {
// visit[i]=true;
// dfs(1);
// }
//
// }
set=new HashSet<>();
dfs(0);
// for(int i=0;i<R;i++) {
// for(int j=0;j<C;j++) {
// }
// }
return set.size();
}
static void dfs(int depth) {
if(depth==R) {
String answer="";
for(int i=0;i<C;i++) {
if(visit[i]==true) {
answer+=i;
}
}
set.add(answer);
return;
}
for(int i=0;i<C;i++) {
if(map[depth][i]==1 && visit[i]==false) {
visit[i]=true;
dfs(depth+1);
visit[i]=false;
}
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
반응형
'Algorithm' 카테고리의 다른 글
[SWEA] 4050. 재관이의 대량 할인 (0) | 2020.04.30 |
---|---|
[SWEA] 5658. 보물상자 비밀번호 (0) | 2020.04.29 |
[Programmers] 튜플 (0) | 2020.04.27 |
[Programmers] 크레인 인형뽑기 게임 (0) | 2020.04.27 |
[SWEA] 5653. 줄기세포배양 (0) | 2020.04.27 |