본문 바로가기
프로그래머스/Python

[프로그래머스] 불량 사용자 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 11. 4.
728x90
반응형

 

 

프로그래머스

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

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

해당 문제는 불량 아이디를 정규식으로 바꾸는 것과 가능한 제재 아이디의 모든 경우를 찾는 것이 관건이다.

불량 아이디를 정규식으로 바꾸면 re.match() 함수를 사용해 쉽게 사용자 아이디가 불량 아이디인지 판별할 수 있다.

불량 아이디에서 * 문자가 특정 1개의 문자를 의미하므로 정규식의 . 문자로 바꾸어 줄 바꿈 문자를 제외한 모든 한 문자와 매치하는지 확인할 수 있다.

또한 사용자 아이디에서 불량 아이디의 개수를 뽑아 나열하는 모든 경우를 permuations() 함수로 구하고 각 경우를 하나씩 불러와 제재 아이디가 되는지 확인하면 모든 제재 아이디의 경우를 구할 수 있다.

 

  1. re.match() 함수를 사용하여 정규식과 문자열이 매치되는지 확인한다. re.match() 함수를 사용하기 위해 re 모듈을 불러온다. import re
  2. 가능한 모든 순열의 조합을 얻기 위해 permuations 함수를 불러온다. from itertools import permutations
  3. 사용자 아이디에서 제재 아이디를 판별하기 위해 불량 사용자 아이디의 * 문자를 . 으로 바꾸어 정규식으로 변환한다. banned_id = [i.replace("*", ".") for i in banned_id]
  4. 가능한 모든 제재 아이디의 조합을 저장할 리스트를 생성한다. result = list()
  5. 우선 사용자 아이디에서 불량 사용자 아이디의 개수만큼 뽑아 나열한 모든 결과를 하나씩 가져온다. for i in permutations(user_id, len(banned_id))
  6. 각 결과를 하나씩 가져와 리스트로 변경한다. i = list(i)
  7. 각 아이디가 불량 아이디일 수 있는지 판별할 변수를 생성한다. check = True
  8. 리스트의 각 아이디를 하나씩 가져와 for j in range(len(i))
  9. 불량 아이디의 정규식과 해당 사용자 아이디가 매치되고, 두 문자열의 길이가 동일하면 계속 판별을 진행한다. if (re.match(banned_id[j], i[j]) and (len(i[j]) == len(banned_id[j]))): continue
  10. 반면에 해당 사용자 아이디가 불량 아이디가 아니면 else
  11. 불량 아이디가 아니라고 판별하고 check = True
  12. 해당 아이디에 대한 불량 아이디 판별을 종료한다. break
  13. 만약 해당 사용자 아이디가 불량 아이디로 판별되면 if (check)
  14. 제재 아이디에 해당 아이디의 조합이 있는지 확인하고 없으면 if (sorted(i) not in result)
  15. 해당 제재 아이디 조합을 추가한다. result.append(sorted(i))
  16. 모든 가능한 제재 아이디 조합을 구했다면 그 개수를 저장한다. answer = len(result)
반응형

3. 소스코드

import re
from itertools import permutations

def solution(user_id, banned_id):
    answer = 0

    banned_id = [i.replace("*", ".") for i in banned_id]

    result = list()
    for i in permutations(user_id, len(banned_id)):
        i = list(i)
        check = True
        for j in range(len(i)):
            if (re.match(banned_id[j], i[j]) and (len(i[j]) == len(banned_id[j]))):
                continue
            else:
                check = False
                break

        if (check):
            if (sorted(i) not in result):
                result.append(sorted(i))

    answer = len(result)
    return answer
728x90
반응형