thkyang324

[프로그래머스] 불량 사용자 (Python 파이썬) 본문

코딩테스트

[프로그래머스] 불량 사용자 (Python 파이썬)

thkyang324 2023. 4. 15. 16:36

불량 사용자

완전탐색, 순열

https://school.programmers.co.kr/learn/courses/30/lessons/64064

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


1<=len(banned_id)<=len(user_id)<=8 으로 매우 적은 경우의 수만이 존재한다. banned_id의 길이만큼 user_id에서 뽑아 매칭시켜보고, 매칭이 되는 경우를 세면 된다.

동일한 id의 user_id가 여러개 들어올 수 있다. 이 경우 제제 아이디 목록이 같아질 수 있으므로, Counter 모듈을 활용해 중복을 제거해준다.

제출 코드는 다음과 같다.

from itertools import permutations
from collections import Counter

def is_match(uid, bid):
    """ 아이디가 banned_id에 매칭되는지 여부를 리턴 """
    if len(uid) != len(bid):
        return False
    for u, b in zip(uid, bid):
        if b=="*" or u==b:
            continue
        else:
            return False
    return True

def is_available_case(user_id, banned_id):
    """ user_id리스트와 banned_id 리스트 (동일한 길이) 가 매칭되는지 여부를 리턴 """
    for uid, bid in zip(user_id, banned_id):
        if not is_match(uid, bid):
            return False
    return True

def solution(user_id, banned_id):
    answer = []
    # 순열을 통해 user_id에서 banned_id의 길이만큼 샘플링한 리스트에 대하여
    for u_ids in permutations(user_id, len(banned_id)):
        # 두 리스트가 매칭되는 경우
        if is_available_case(u_ids, banned_id):
            cnt = Counter(u_ids)
            # 중복되지 않는다면 answer에 추가한다.
            if cnt not in answer:
                answer.append(cnt)
    return len(answer)

 

Comments