(Python) 프로그래머스 - 불량 사용자
in Algorithm on Programmers, Level3
[문제 링크]
풀이
import re
import itertools
def solution(user_id, banned_id):
answer = 0
# 작은따옴표 안에 넣어줘야 딱 길이에 맞는 것을 매칭할 수 있다.
# 따옴표를 넣지 않으면 길이가 넘어서 매칭되는 것도 찾아진다.
# 처음에는 \w이 아니라 .을 사용했는데 이렇게 되면 길이차이에 의해 "가 .에 매칭될 수도 있다.
banned_id = ["'" + bid.replace('*', '\w') + "'" for bid in banned_id]
# user_id는 리스트이므로 string으로 변환해서 넣어줘야 한다.
possible_list = [re.findall(bid, str(user_id)) for bid in banned_id]
# product로 만들어진 리스트에서 하나씩 꺼내서 경우의 수를 만들어준다.
possible_list = list(itertools.product(*possible_list))
# 만들어 낸 경우의 수에서 중복을 검사하고 길이가 일치하면 가능한 경우의 수로 취급하여 배열에 추가해준다.
banned_length = len(banned_id)
possible_list = [frozenset(p) for p in possible_list if len(set(p)) == banned_length]
# 배열에는 같은 형태의 set이 들어가 있을 수 있으므로 다시 set을 취해 중복을 제거해줘야 한다.
# set은 hash를 사용하고 set의 인자로는 hashable한 객체가 와야한다.
# 보통 hashable한 객체는 대부분 immutable이다. set은 mutable이고 frozenset은 immutable이다.
# 따라서 만약 위에서 set으로 배열에 저장해뒀다면 이번에 중복제거로 set을 사용하지 못한다.
# 따라서 hashable한 frozenset을 사용해야만 한다.
possible_list = set(possible_list)
return len(possible_list)