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

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

코드

answer = set()

def ck(i,ans,check):
    if i==len(check):
        answer.add(tuple(sorted(ans)))
        return
    for j in check[i]:
        if not j in ans:
            ck(i+1,ans+[j],check)
    
def solution(user_id, banned_id):
    check=[[] for _ in range(len(banned_id))]
    for n,i in enumerate(banned_id):
        for j in user_id:
            if len(i)!=len(j):
                continue
            for idx in range(len(i)):
                if i[idx]!="*" and i[idx]!=j[idx]:
                    break
            else:
                check[n].append(j)
    ck(0,[],check)
    return len(answer)
    

단계로 나눠서 문제를 풀었다.

  1. banned_id와 같은 user_id를 포함하는 배열을 만들기

    banned_id 와 같은 길이의 배열을 선언해서 *을 포함해서 같은 user_id를 append 했다.

  2. 배열에 있는 것들로 가능한 경우 모두 만들기

    재귀하면서 가능한 경우들을 배열에 추가했다. 대신, 이미 배열안에 존재하는 값을 append 하려는 경우는 제외했다.

  3. 가능한 경우 중에서 중복 제거 banned_id 길이 만큼 만들경우, ans를 sort해서 set에 넣었다. 이 과정에서 중복이 사라진다.

Discussion and feedback