프로그래머스 LV1 신규 아이디 추천(21 카카오 블라인드 테스트)

프로그래머스 LV1 신규 아이디 추천(21 카카오 블라인드 테스트)

2021, Apr 02    

프로그래머스 lv1 신규 아이디 추천(21 카카오 블라인드 테스트)

보자마자 정규표현식이 떠올랐음.


풀이


"""
1단계 new_id 대문자-> 소문자
2단계 new_id 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거
3단계 new_id (.)가 2번 이상 -> 하나의 마침표(.)로 치환
4단계 new_id (.)가 처음이나 끝에 위치한다면 제거
5단계 new_id 빈 문자열이라면, new_id에 "a"를 대입
6단계 new_id 길이가 16자 이상 나머지 문자들을 모두 제거
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
7단계 new_id 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
"""

import re

def solution(new_id):
    answer = ''
    
    # 1단계
    answer = new_id.lower()
    
    # 2단계
    answer = re.sub(r"[^a-z0-9\-|_|.]","",answer)
    
    # 3단계 마침표 반복-> 한개로
    answer = re.sub(r"\.{1,}",".",answer)
    
    # 4 단계 마침표(.)처음 끝 제거
    answer = re.sub(r"^\.|\.$","",answer)
    
    # 5 단계 new_id가 빈 문자열이면 "a" 대입
    if answer == '':
        answer = 'a'
        
    # 6 단계 16자 이상이면 16번째부터 모두 제거. 제거 후 맨 마지막이 마침표(.)면 마침표 문자도 제거
    answer = re.sub('\.$', '', answer[:15])
    
    # 7 단계 new_id가 2자 이하면 new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙이기.
    while len(answer) < 3:
        answer += answer[-1:]
    
    return answer


if __name__ == " __main__":
    new_id = "...!@BaT#*..y.abcdefghijklm" # result = "bat.y.abcdefghi"
#     new_id = "z-+.^." # result = "z--"
#     new_id = "=.=" # result = "aaa"
#     new_id = "123_.def" # result = "123_.def"
#     new_id = "abcdefghijklmn.p" # result = 	"abcdefghijklmn"
    print(solution(new_id))
# 다른 사람 풀이2

import re

def solution(new_id):
    st = new_id
    st = st.lower()
    st = re.sub('[^a-z0-9\-_.]', '', st)
    st = re.sub('\.+', '.', st)
    st = re.sub('^[.]|[.]$', '', st)
    st = 'a' if len(st) == 0 else st[:15] 
    st = re.sub('^[.]|[.]$', '', st)
    st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))]) 
    return st

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges