코딩테스트 공부 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으로 기록할 날이 오길 바란다.
화이팅.
Author And Source
이 문제에 관하여(코딩테스트 공부 5), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tacohun21/코딩테스트-공부5저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)