[프로그래머스]-신규 아이디 추천

이정연·2022년 10월 18일
0

CodingTest

목록 보기
62/165

string.upper(): 대문자 변환
string.lower(): 소문자 변환

나의 CODE

def solution(new_id):
    new_id = list(new_id)
    flag = {'-','_','.'}
    #1. 대문자 소문자 치환
    for i in range(len(new_id)):
        if new_id[i].isupper():
            new_id[i] = new_id[i].lower()
    #2. 소문자,숫자,-,_,. 제외 문자 제거
    for i in range(len(new_id)):
        if not new_id[i].isalpha() and not new_id[i].isdigit() and new_id[i] not in flag:
            new_id[i] = ''
    new_id = list("".join(new_id))
    #3. . 여러 개 하나로 치환
    for i in range(len(new_id)):
        if new_id[i] == '.':
            while i+1 < len(new_id) and new_id[i+1] == '.':
                new_id[i+1] = ''
                i += 1
    new_id = list("".join(new_id))
    #4. 마침표 처음 끝 제거
    if new_id[0] == '.':
        new_id[0] = ''
    if new_id[-1] == '.':
        new_id[-1] = ''
    new_id = list("".join(new_id))
    #5. new_id = blank --> 'a'
    if new_id == []:
        new_id = ['a']
    #6. 길이 16자 이상: 처음 15개까지
    if len(new_id) >= 16:
        new_id = new_id[:15]
    if new_id[-1] == '.':
        new_id[-1] = ''
    new_id = list("".join(new_id))
    #7. 길이 2자 이하: 마지막 문자로 3개까지 채움
    if len(new_id) <= 2:
        while len(new_id) < 3:
            new_id.append(new_id[-1])
    return "".join(new_id)

코드를 작성하면서도 "이렇게 푸는 것이 맞나..?" 하는 의문이 들었다.
당연히 아니었다. 이런 단순무식한 방법보다 더욱 빠르고 간결한 코드가 있었으니!
바로 정규 표현식을 활용한 코드다.

정규 표현식

참고 블로그

베스트 CODE

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
profile
0x68656C6C6F21

0개의 댓글