문제
요약
- user_id 배열이 주어진다.
- banned_id 배열이 주어진다. 불량사용자의 아이디는 1개 이상의 자리가 *로 익명 처리 돼있다.
- banned_id 가 될 수 있는 user_id 의 조합의 개수를 반환하자.
- user_id 의 길이는 1~8 이다.
분류
- 완전 탐색
- 순열
풀이
1. 완전 탐색, 순열
- 각 banned_id에 대해, user_id 가 될 수 있는지 탐색한다. 해당 banned_id의 인덱스에 banned_id가 될 수 있는 user_id를 2차원 배열로 저장한다.
- 이차원 배열의 각 원소(1차원 배열)에서 하나씩 뽑아서 모든 경우를 만든다. (순열 : permutation)
- 만들어진 경우들이 유효한지 검사한다. 유효하려면, (1) 중복된 원소가 없고, (2) 다른 조합과 원소의 순서만 다르고 내용은 같으면 안 된다.
- 유효한 배열의 갯수를 반환한다.
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)