코딩테스트 공부 5

코딩테스트 공부

Programmers - level1

신규아이디 추천

python 3

Problem:




My Solution:

import string
import re

def solution(new_id):
    answer = ''
    answer = new_id.lower()
    
    symbols = string.punctuation.replace("-", "").replace("_","").replace(".","")
    for symbol in symbols:
        answer = answer.replace(symbol, "")
    
    # answer.replace("..", ".")
    answer = re.sub("[.]+",".", answer)
    
    if answer[0] == ".":
        answer = answer[1:]
    # if answer[-1] == ".":
    if len(answer) > 0 and answer[-1] == ".":
        answer = answer[:-1]
    
    if answer == "":
        answer = "a"
    
    if len(answer) >= 16:
        answer = answer[:15]
    # if answer[-1] == ".":
    if len(answer) > 0 and answer[-1] == ".":
        answer = answer[:-1]
    
    if len(answer) <= 2:
        while len(answer) != 3:
            answer += answer[-1]
    
    return answer

문제를 읽으면서 딱 정규표현식을 써야겠구나 라고 생각했다.
하지만 정규표현식 사용법이 잘 기억나지 않아서 다른방법이 없을까 하고 한참 고민을 했다.
이것 저것 찾아보다가 String.punctuation 이라는걸 알게 되었다.
정규 표현식 없이도 특수문자들을 걸러낼 수 있었다.
연속된 "."을 제거하는 코드는
answer.replace("..", ".") 를 사용했었는데 이렇게 되면 2번 이상 .이 반복되는 경우를 거를 수 없을 것 같아 정규표현식을 사용했다.
하지만 while loop 를 사용해서 해결한 사람도 있었다...

그리고 마지막 .을 제거하는 코드는 answer[-1]을 사용했었는데 문자열의 길이가 0인 경우는 에러가 나기 때문에 문자열의 길이를 같이 체크하게 바꾸었다.

Better Solution

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

이렇게 간단하게 끝내버리는 사람도 있다...
정규표현식 장인이신가...

for c in new_id:
        if c.isalpha() or c.isdigit() or c in ['-', '_', '.']:
            answer += c

라이브러리 추가 없이 이런식으로 특수문자를 거른 사람도 있었다.

언젠가는 better solution이 아닌 other solution으로 기록할 날이 오길 바란다.
화이팅.

좋은 웹페이지 즐겨찾기