문제

[프로그래머스] 신규 아이디 추천 (LV. 1)

요약

  1. 대문자를 소문자로 치환
  2. 소문자, 숫자, -, _, . 를 제외한 모든 문자 제거
  3. 마침표(.) 가 2번 이상 연속되면 하나로 치환
  4. 처음이나 끝에 마침표(.)가 나타나면 제거
  5. 빈 문자열이라면 “a” 추가
  6. 길이가 16 이상이면, 첫 15개 문자만
  7. 길이가 2자 이하면 마지막 문자를 길이가 3이 될 때까지 반복해서 더함.


분류

  • 문자열
  • 정규표현식

풀이

1. 내 풀이

  • 야매로 하라는 거 했다. (쓰레기 풀이라는 뜻)


def solution(new_id):
    new_id = list(new_id.lower()) #1단계

    special = ['~','!','@','#','$','%','^','&','*','(',')','=','+','[','{',']','}',':','?',',','<','>','/'] #1단계
    arr = []
    key = False
    l = len(new_id)
    for i in range(l):
        if new_id[i] not in special : #2단계
            if new_id[i] == '.' :#3단계
                if key:
                    continue
                else:
                    arr.append(new_id[i])
                    key = True
                    continue
            else:
                key = False
                arr.append(new_id[i])


    if len(arr) != 0 and arr[0] == '.' : del arr[0] #4단계
    if len(arr) != 0 and arr[-1] == '.' : del arr[-1]

    if len(arr) == 0: arr.append('a') #5단계


    if len(arr) >= 16:  #6단계
        arr = arr[:15]
        if arr[-1] == '.': del arr[-1]

    while len(arr) < 3: # 7단계
        arr.append(arr[-1])

    return ''.join(arr)

2. 프로그래머스 좋아요 많은 풀이

1. 최적화


def solution(new_id):
    answer = ''
    # 1
    new_id = new_id.lower()
    # 2
    for c in new_id:
        if c.isalpha() or c.isdigit() or c in ['-', '_', '.']:
            answer += c
    # 3
    while '..' in answer:
        answer = answer.replace('..', '.')
    # 4
    if answer[0] == '.':
        answer = answer[1:] if len(answer) > 1 else '.'
    if answer[-1] == '.':
        answer = answer[:-1]
    # 5
    if answer == '':
        answer = 'a'
    # 6
    if len(answer) > 15:
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:-1]
    # 7
    while len(answer) < 3:
        answer += answer[-1]
    return answer

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