본문 바로가기

내일배움 캠프/TIL

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

주어진 문제를 해결하기위해 정규표현식을 사용할까 고민했지만 아직 정규 표현식을 잘 모르는 관계로

그냥 대가리 박아가면서 했다

def solution(new_id):
    new_id = stage1(new_id)
    new_id = stage2(new_id)
    new_id = stage3(new_id)
    new_id = stage4(new_id)
    new_id = stage5(new_id)
    new_id = stage6(new_id)
    new_id =stage7(new_id)
    return new_id

문제는 함수를 불러오는 식으로 해서 7개의 단계를 하나씩 처리했고

def stage1(new_id):
    return new_id.lower()

1번째 조건인 소문자로 만들기 lower()을 이용해서 소문자로 만들었다

def stage2(new_id):
    limit=['-','_','.']
    result = []
    for spec in new_id:
        if spec.isalpha() or spec.isdigit():
            result.append(spec)
        elif spec in limit:
            result.append(spec)
    return ''.join(result)

2번째 조건은 주어진 특수기호와 숫자 알파벳만 나오게 바꾸는거로 isalpha 랑isdigit를 이용해서 알파벳과 정수 데이터인지 검증을 했고 예외인 특수문자는 리스트로 안에 값이 존재하는지 확인하고 append를 해서 2단계를 처리했다

def stage3(new_id):
    if '..' in new_id:
        new_id = new_id.replace('..','.')
        return stage3(new_id)
    else:
        return new_id

3단계같은 경우에는 .이 2개 이상 연속으로 나온경우에는 .을 1개로 바꾸는건데 ..을 .으로 바꾸는걸 자기자신을 호출시켜서 ..이 2개가아니라 2개이상일경우에도 .이되게했다

def stage4(new_id):
    if new_id[0]=='.':
        new_id = new_id[1:]
    if new_id[-1:]=='.':
        new_id = new_id[:-1]
    return new_id

4단계에는 인덱스의 0과 마지막이 .으로 시작할 경우에는 텍스트 슬라이싱을 이용해서 그 인덱스를 빼버렸다

def stage5(new_id):
    if new_id == '' :
        return 'a'
    else:
        return new_id

5단계에서는 이조건을 다했을시에 문자열의 길이가 0 인 경우에는 a값을 return하고 아니면 자기자신을 리턴하는 코드다

def stage6(new_id):
    new_id = new_id[:15]
    return stage4(new_id)

6단계에서는 텍스트슬라이싱으로 15개가 넘는 문자열을 자르고 다시한번더 4단계를 통해서 .으로 끝나는 문자열이 있나 확인을 했습니다

def stage7(new_id):
    if len(new_id)<3:
        new_id+=new_id[-1:]
        return stage7(new_id)
    else:
        return new_id

마지막으로 6단계까지 했을떄 문자열의 길이가 3 보다 작을경우에 인덱스의 마지막 문자열을 문자열의 길이가 3이될떄가지 뒤에다가 붙여넣는 코드입니다