코딩테스트 연습 - 신규 아이디 추천
유저들이 규칙에 맞지 않는 아이디를 만들었을 때, 입력한 아이디와 유사하면서 규칙에 맞는 아이디를 추천하는 서비스를 개발하라.
합계 : 80.0 / 100.0 : 3,5,14,20,21 실패
def solution(new_id):
new_id = new_id.lower() #1단계
dot = 0 # 마침표 개수 count
for i in new_id: # 2단계
if i.isdigit() or i.islower() or i =='-' or i == '_' or i == '.':
continue
else:
new_id = new_id.replace(i,'')
for idx, i in enumerate(new_id): # 3단계
if i == '.':
dot += 1
if idx != len(new_id)-1:
continue
if (i == new_id[-1] or i != '.') and dot >= 1:
if dot > 1:
new_id = new_id.replace('.'*dot, '.')
dot = 0
if new_id[0] == '.': # 4단계
new_id = new_id[1:]
if not new_id:#5단계
new_id += 'a'
if new_id[-1] == '.':
new_id = new_id[:-1]
if len(new_id) >= 16: #6단계
new_id = new_id[:15]
if new_id[-1] == '.':
new_id = new_id[:14]
if len(new_id) <= 2: #7단계
while(len(new_id) < 3):
new_id += new_id[-1]
return new_id
정규표현식을 사용한 것 말고는 논리적으로 차이가 없는 것 같은데 정답처리가 되었다. 특정 문자만 포함하거나 예외시키는 규칙이 있는 경우 정규표현식을 사용하면 효율적으로 원하는 데이터를 구할 수 있는 것 같다.
다른 글들을 읽어보면 확실하진 않지만 replace() 함수를 이용하여 문자열을 빈 문자열로 바꾸는 경우에 테스트케이스에서 실패처리가 되는 것 같다.
import re
def solution(new_id):
answer = new_id.lower()
answer = re.sub("[^-_.a-z0-9]","",answer) # 소문자, 숫자, -, _, .
answer = re.sub("[.]+", ".",answer) # 2번 이상 연속된 마침표 치환
answer = re.sub("^[.]|[.]$", "",answer) # 마침표가 맨앞이거나 맨뒤에 있으면 제거
if not answer:
answer += 'a'
if len(answer) >= 16:
answer = answer[:15]
if answer[-1] == '.':
answer = answer[:14]
if len(answer) <= 2:
while(len(answer) < 3):
answer += answer[-1]
return answer
다른 사람의 코드를 가져와봤다. 대부분을 정규표현식으로 처리하였다.
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