728x90
😉 아이디어
1. _!banned_id!_패턴을 기준으로 _!user_id!_를 순회하며 경우의 수 완성
2. 경우의 수를 구성하는 유저는 동일하지만 패턴이 다양해서 다른 경우의 수로 판별됨 👉 순서 상관없는 조합 산출 필요
3. 산출된 경우의 수를 정렬하고 튜플과 세트 자료형으로 중복방지
😉 풀이
count = 0
# 중복된 튜플이 담기지 않도록 set 자료형 사용
result = set([])
def solution(user_id, banned_id):
answer = 0
max_depth = len(banned_id)
combination([], 0, user_id, banned_id, max_depth)
return len(result)
def combination(arr, depth, user_id, banned_id, max_depth):
global result
if depth == max_depth:
if len(arr) == max_depth:
arr.sort()
result.add(tuple(arr))
return
# banned_id 패턴을 기준으로 순회 시작
for i in range(depth, len(banned_id)):
bid = banned_id[i]
# 대상 banned_id에 해당하는 user_id 탐색
# 일치한다면, depth를 올리고 user_id가 중복선택되지 않도록 배열에서 제거
for uid in user_id:
if check(bid, uid):
copy_arr = arr.copy()
copy_arr.append(uid)
copy_user_id = user_id.copy()
copy_user_id.remove(uid)
combination(copy_arr, i + 1, copy_user_id, banned_id, max_depth)
def check(pattern, ide):
valid = True
# print(f'패턴 길이 : {len(pattern)}, 아이디 길이 : {len(ide)}')
if len(pattern) != len(ide):
valid = False
return valid
for i in range(len(pattern)):
if pattern[i] != '*' and pattern[i] != ide[i]:
valid = False
break
return valid
✔️ 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/64064?language=python3