user_id 리스트와 user_id가 일부 마스킹된 banned_id 리스트가 주어진다. banned_id에 매칭되는 경우의 수는 몇개가 존재하는가?
[제한사항]
순열을 활용하여 user_id를 banned_id의 수에 맞게 뽑은 뒤 확인한다.
순열의 경우 순서가 바뀌었지만 같은 경우가 존재할 수 있으므로 set의 형태로 넣어준다.
from itertools import permutations
def isMatch(user_set, banned_set):
# 선택된 user_set 집합이 banned_set의 목록들에 순서까지 맞아떨어지는가?
for i in range(len(user_set)):
# 길이가 맞지 않다면 False
if len(user_set[i]) != len(banned_set[i]):
return False
# 마스킹 이외에 모든 부분은 같은가?
for j in range(len(user_set[i])):
if banned_set[i][j] == '*':
continue
if user_set[i][j] != banned_set[i][j]:
return False
return True
def solution(user_id, banned_id):
ans = []
for com_set in permutations(user_id, len(banned_id)):
# user_id 중 banned_id의 수에 해당하는 만큼 고르자. 단, banned_id와의 순서를 고려해서 순열을 활용한다.
if isMatch(com_set, banned_id):
# 들어갈 때는 순서에 상관없이 같은 경우로 봐야하기 때문에 set으로 변경
com_set = set(com_set) # 중복 제거
if com_set not in ans:
ans.append(com_set)
return len(ans)
나는 왜 마스킹에 들어갈 수 있는 모든 경우의 수랑 대조하겠다는 생각을 했을까?
당시에 이 문제를 만나서 못풀었던 경험이 있는데 풀고나니 시원한 느낌이 든다.