코딩테스트 연습 - 신규 아이디 추천

Gyuhan Park·2021년 7월 17일
0

코딩테스트 정복

목록 보기
11/47

코딩테스트 연습 - 신규 아이디 추천

유저들이 규칙에 맞지 않는 아이디를 만들었을 때, 입력한 아이디와 유사하면서 규칙에 맞는 아이디를 추천하는 서비스를 개발하라.

# 오류코드

합계 : 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
profile
단단한 프론트엔드 개발자가 되고 싶은

0개의 댓글