[프로그래머스] 불량 사용자

문제

  • 개인정보 보호를 위해 사용자 아이디 중 일부 문자를 '*' 문자로 가려서 전달
  • 제재 아이디: 불량 사용자 목록에 매핑된 응모자 아이디

이벤트 응모자 아이디 목록이 담긴 배열 user_id와 불량 사용자 아이디 목록이 담긴 배열 banned_id가 매개변수로 주어질 때, 당첨에서 제외되어야 할 제재 아이디 목록은 몇 가지 경우의 수가 가능한지 return 하도록 solution 함수를 완성해주세요.

제한사항

  • user_id 배열의 크기는 1 이상 8 이하입니다.
  • user_id 배열 각 원소들의 값은 길이가 1 이상 8 이하인 문자열입니다.
    • 응모한 사용자 아이디들은 서로 중복되지 않습니다.
    • 응모한 사용자 아이디는 알파벳 소문자와 숫자로만 구성되어 있습니다.
  • banned_id 배열의 크기는 1 이상 user_id 배열의 크기 이하입니다.
  • banned_id 배열 각 원소들의 값은 길이가 1 이상 8 이하인 문자열입니다.
    • 불량 사용자 아이디는 알파벳 소문자와 숫자, 가리기 위한 문자 '*'로만 이루어져 있습니다.
    • 불량 사용자 아이디는 '*' 문자를 하나 이상 포함하고 있습니다.
    • 불량 사용자 아이디 하나는 응모자 아이디 중 하나에 해당하고 같은 응모자 아이디가 중복해서 제재 아이디 목록에 들어가는 경우는 없습니다.
  • 제재 아이디 목록들을 구했을 떄 아이디들이 나열된 순서와 관계없이 아이디 목록의 내용이 동일하다면 같은 것으로 처리하여 하나로 세면 됩니다.

코드

from copy import deepcopy

def solution(user_id, banned_id):
    answer = []
    maps = {}
    for ban in banned_id:
        if ban not in maps:
            for user in user_id:
                if check(ban, user):
                    if ban in maps:
                        maps[ban].append(user)
                    else:
                        maps[ban] = [user]
    
    solve(maps, 0, [], banned_id, len(banned_id), answer)
    return len(answer)

def check(ban, user):
    if len(ban) != len(user):
        return False
    for w in range(len(ban)):
        if ban[w] != user[w] and ban[w] != '*':
            return False
    return True

def solve(maps, index, result, banned_id, length, answer):
    if index == length:
        tmp = sorted(deepcopy(result))
        if tmp not in answer:
            answer.append(tmp)
        return 
    for m in maps[banned_id[index]]:
        if m not in result:
            result.append(m)
            solve(maps, index+1, result, banned_id, length, answer)
            result.pop()    

좋은 웹페이지 즐겨찾기