문제

[프로그래머스] 불량 사용자 (LV. 3)

요약

  • user_id 배열이 주어진다.
  • banned_id 배열이 주어진다. 불량사용자의 아이디는 1개 이상의 자리가 *로 익명 처리 돼있다.
  • banned_id 가 될 수 있는 user_id 의 조합의 개수를 반환하자.
  • user_id 의 길이는 1~8 이다.

분류

  • 완전 탐색
  • 순열

풀이

1. 완전 탐색, 순열

  1. 각 banned_id에 대해, user_id 가 될 수 있는지 탐색한다. 해당 banned_id의 인덱스에 banned_id가 될 수 있는 user_id를 2차원 배열로 저장한다.
  2. 이차원 배열의 각 원소(1차원 배열)에서 하나씩 뽑아서 모든 경우를 만든다. (순열 : permutation)
  3. 만들어진 경우들이 유효한지 검사한다. 유효하려면, (1) 중복된 원소가 없고, (2) 다른 조합과 원소의 순서만 다르고 내용은 같으면 안 된다.
  4. 유효한 배열의 갯수를 반환한다.
from itertools import product

def isCorrect(user, ban):
    if len(user) != len(ban) : return False
    for i in range(len(user)):
        if ban[i] == '*': continue
        if ban[i] != user[i]: return False
    return True

def solution(user_id, banned_id):
    arr = [[] for ban in banned_id]

    for i, ban in enumerate(banned_id):
        for user in user_id:
            if isCorrect(user, ban):
                arr[i].append(user)

    pro = list(product(*arr))
    answer = []
    for val in pro:
        if len(set(val)) != len(val): continue
        if sorted(val) not in answer: answer.append(sorted(val))

    return len(answer)