Skip to content

Commit 2ebf91b

Browse files
committed
[PGS] 불량 사용자 / Level3 / 40분
1 parent 7665d44 commit 2ebf91b

File tree

1 file changed

+57
-0
lines changed

1 file changed

+57
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
def solution(user_id, banned_id):
2+
# [j_idx, current]
3+
answer = set()
4+
lenU, lenB = len(user_id), len(banned_id)
5+
stack = [[0, [], [0] * lenU, [0] * lenB]]
6+
7+
while stack:
8+
j_idx, current, uvisited, bvisited = stack.pop()
9+
if len(set(current)) == len(banned_id):
10+
answer.add(tuple(sorted(current)))
11+
continue
12+
13+
for i in range(lenU):
14+
for j in range(j_idx, lenB):
15+
if not uvisited[i] and not bvisited[j]:
16+
condition1 = len(user_id[i]) == len(banned_id[j])
17+
condition2 = True
18+
for a, b in zip(user_id[i], banned_id[j]):
19+
if b != '*' and a != b:
20+
condition2 = False
21+
break
22+
if condition1 and condition2:
23+
new_uvisited = uvisited[:]
24+
new_bvisited = bvisited[:]
25+
new_bvisited[j] = new_uvisited[i] = True
26+
new_stack = current[:]
27+
new_stack.append(user_id[i])
28+
stack.append([j+1, new_stack, new_uvisited, new_bvisited])
29+
#print(answer)
30+
return len(answer)
31+
32+
33+
def is_match(user_id, banned_id):
34+
if len(user_id) != len(banned_id):
35+
return False
36+
for u, b in zip(user_id, banned_id):
37+
if b != '*' and u != b:
38+
return False
39+
return True
40+
41+
def count_unique_combinations(user_id, banned_id, idx, used, used_banned, result, results):
42+
if idx == len(banned_id):
43+
results.add(tuple(sorted(result)))
44+
return
45+
46+
for i, user in enumerate(user_id):
47+
if not used[i] and is_match(user, banned_id[idx]):
48+
used[i] = True
49+
result.append(user)
50+
count_unique_combinations(user_id, banned_id, idx + 1, used, used_banned, result, results)
51+
result.pop()
52+
used[i] = False
53+
54+
def solution(user_id, banned_id):
55+
results = set()
56+
count_unique_combinations(user_id, banned_id, 0, [False] * len(user_id), [False] * len(banned_id), [], results)
57+
return len(results)

0 commit comments

Comments
 (0)