[프로그래머스/파이썬] 불량 사용자(64064) 풀이

업데이트:



문제 정보


풀이

문제

와일드카드(*)가 포함된 banned_id 패턴들에 대해 user_id를 중복 없이 매칭시키는 모든 경우의 수를 구하는 문제입니다.

같은 사용자 조합이라면 순서가 달라도 1개로 취급합니다.

코드

def solution(user_id, banned_id):
    answer = []
    banned_id.sort()
    dfs(banned_id, 0, set(user_id), tuple(), answer)
    
    return len(set(answer))

def dfs(banned_id, index, uid_set, comb, answer):
    if index >= len(banned_id):
        answer.append(tuple(sorted(comb)))
        return
    
    for uid in uid_set:
        if len(uid) != len(banned_id[index]): continue
        banned = True
        for i in range(len(uid)):
            if banned_id[index][i] != uid[i] and banned_id[index][i] != '*':
                banned = False
                break
        if banned: dfs(banned_id, index+1, uid_set-set([uid]), comb+tuple([uid]), answer)
    

print(solution(["frodo", "fradi", "crodo", "abc123", "frodoc"], ["fr*d*", "abc1**"]))

설명

DFS로 banned 패턴을 하나씩 처리합니다.

  • 현재 패턴과 길이/문자 조건이 맞는 user를 고릅니다.
  • 고른 user는 다음 단계에서 제외합니다.
  • 끝까지 매칭되면 조합을 정렬 튜플로 저장합니다.

마지막에 set(answer) 크기를 반환하면 순서만 다른 중복 조합이 제거된 경우의 수를 얻을 수 있습니다.



댓글남기기