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

허준현·2021년 7월 18일
0

CodingTest

목록 보기
1/8
post-thumbnail

프로그래머스에 올라와 있는 카카오 2019 인턴 3번 문제이다.

https://programmers.co.kr/learn/courses/30/lessons/64064
문제는 위 사이트를 참고를 하되 문제를 읽어보면서 중요하게 생각한 부분은 다음과 같다.

Problem Point

  1. 불량 사용자 아이디는 '*' 문자를 하나 이상 포함하고 있습니다.
  2. 제재 아이디 목록들을 구했을 때 아이디들이 나열된 순서와 관계없이 아이디 목록의 내용이 동일하다면 같은 것으로 처리하여 하나로 세면 됩니다.

만약 불량 사용자 아이디 값이 전부 '*' 로 이루어져 있다면 글자수만 같으면 어떤 경우의 수에 포함이 되며 순서와 관계없이 아이디 목록의 내용이 동일하면 같은 것으로 처리된다는 것으로 보아 set 값을 비교하여 같은 값을 포함하고 있으면 추가를 하지 않겠다고 생각하였다.

풀이

맨 처음 접근할때는 banned_id 값에 어울리는 user_id값들을 찾아서 각 갯수를 곱한값 혹은 banned_id 값중에서 최대값이 result 값이 되는 규칙을 찾아내려고 하였으나 banned_id 중에 겹치는 user_id를 처리하는 것이 어려워 포기하였다.

처음에는 2번 조건을 보고 순서가 상관없으니 임의의 유저를 banned_id 만큼 가져올 때 combination을 쓰려고 생각하였으나 유저의 순서에 따라서 담겨지는 결과값이 순서만 다른게 아니라 안의 내용도 다를수 있다는 것을 파악하여 순서도 포함하는 permutation를 사용하기로 결정하였다.

또 한 banned_id가 나타내는 모양이 파이썬을 공부할 때 잠시 배웠던 정규식과 비슷하여 user_id 값과 banned_id 값을 매칭하는 것을 정규식을 사용하였다. 정규식을 사용하기 전에 기존에 '*' 문자를 '.' 문자로 바꿔주어 바로 정규식에 사용할 수 있게 만들었다.
작성한 정규식이 조금 부족하여 앞의 조금은 맞고 뒤에 추가 되어있는 글자도 Match 된다고 파악하여 글자수 제한도 걸어주었다.
만약 정규식에 대해서 모른다고 하더라고 user_id 글자수만큼 인덱스에 접근하여 같은지에 대한 여부를 판단하면 될 것이다.

최종풀이

from itertools import permutations
import re


def isMatch(user_id, ban_id):
    for i in range(len(ban_id)):
        p = re.compile(ban_id[i])
        if not p.match(user_id[i]) or len(user_id[i]) != len(ban_id[i]):
            return False
    return True


def solution(user_id, banned_id):
    ban_id = []
    answer = []
    for i in banned_id:
        b = i.replace('*', '.')
        ban_id.append(b)
    for i in permutations(user_id, len(ban_id)):
        if isMatch(i, ban_id):
            i = set(i)
            if i not in answer:
                answer.append(i)
    return len(answer)
profile
best of best

0개의 댓글