def solution(user_id, banned_id):
def check(u, b):
if len(u) != len(b):
return False
for i in range(len(u)):
if b[i] == '*':
continue
if u[i] != b[i]:
return False
return True
def dfs(idx):
if idx == len(banned_id):
tmp_list = []
for i in range(len(visited)):
if visited[i] == True:
tmp_list.append(user_id[i])
answer.add(tuple(tmp_list))
return
for i in range(len(user_id)):
if not visited[i] and check(user_id[i], banned_id[idx]):
visited[i] = True
dfs(idx+1)
visited[i] = False
answer = set()
visited = [False] * len(user_id)
dfs(0)
return len(answer)
dfs를 통해 해결한 문제
몇가지 경우의 수가 있는지를 물어보는 문제이므로 모든 경우를 찾아야 한다. 모든 경우를 탐색할 때는 dfs 알고리즘을 선호해서 dfs를 통해 문제를 해결했다.
탐색하면서 uesr_id와 banned_id가 일치하는지 확인하고 일치한 갯수가 banned_id의 lengh와 같다면 즉 banned_id와 일치한 user_id를 모두 찾았다면 set에 찾은 user_id를 저장한다. set을 사용한 이유는 모든 경우를 찾기 때문에 중복한 경우가 있을 수 있기 때문이다. (문제 조건이 순서는 다르고 이름이 같다면 같은 경우라고 주어졌다.)
마지막으로 set의 길이를 return 해줌으로서 정답을 구할 수 있다.
다른 많은 분들은 정규식을 사용해서 해결하셨던데... 정규식 까지 공부......