코딩테스트 연습 - 불량 사용자 | 프로그래머스 (programmers.co.kr)

 

상당한 고민을 하게 만들었던 문제이다..

최대한의 효율로 풀고자 노렸했었으나. 결국 마지막 관문에서 순열조합을 어찌 사용할지 고민하다가.. 결국 permutations를 사용해서 모든 경우의 수를 다 탐색하기로 변경했다..

첫번째 풀이..

import re
from collections import defaultdict
import itertools
def solution(user_id, banned_id):
    answer = 1
    bands=list(map(lambda x:x.replace('*','.'), banned_id))
    tmpdic=defaultdict(list)
    diccnt={}
    for band in bands:
        comp = re.compile(band)
        for user in user_id:
            if comp.match(user) and len(band)==len(user):
                tmpdic[band].append(user)
        if diccnt.get(band): diccnt[band]+=1
        else: diccnt[band]=1
    
    print(tmpdic)
    print(diccnt)
    for key in tmpdic.keys():
        list(itertools.combinations(tmpdic[key], diccnt[key]))
        

    return answer

# user_id, banned_id=["frodo", "fradi", "crodo", "abc123", "frodoc"],["fr*d*", "abc1**"]	#2
# user_id, banned_id=["frodo", "fradi", "crodo", "abc123", "frodoc"],["*rodo", "*rodo", "******"]	#2
user_id, banned_id=["frodo", "fradi", "crodo", "abc123", "frodoc"],["fr*d*", "*rodo", "******", "******"]	#3
solution(user_id,banned_id)

 

이 이후의 과정에서 막혔따.. 
문제는, 몇개의 banned_id 가 등장할 지 모르는 상황에서, 이것을 제대로 이어나가지 못하였다..

그리하여, 순열을 활용했따..

import re
import itertools
def solution(user_id, banned_id):
    # answer = 0
    permu = list(itertools.permutations(user_id, len(banned_id)))
    bands=list(map(lambda x:x.replace('*','.'), banned_id))
    comps=[]
    for band in bands:
        comps.append([len(band),re.compile(band)])
    tmp=[]
    for perm in permu:
        if check(comps,perm):
            perm = set(perm)
            if set(perm) not in tmp:
                tmp.append(perm)
    # print(tmp)
    return len(tmp)
def check(comps,perm):
    for comp, user in zip(comps,perm):
        if comp[1].match(user)==None or comp[0]!=len(user):
            return False
    return True

user_id, banned_id=["frodo", "fradi", "crodo", "abc123", "frodoc"],["fr*d*", "abc1**"]	#2
# user_id, banned_id=["frodo", "fradi", "crodo", "abc123", "frodoc"],["*rodo", "*rodo", "******"]	#2
# user_id, banned_id=["frodo", "fradi", "crodo", "abc123", "frodoc"],["fr*d*", "*rodo", "******", "******"]	#3
solution(user_id,banned_id)

 

+ Recent posts