[프로그래머스] 1단계_신규 아이디 추천 (python) (다시 도전하기)

juyeon·2022년 6월 14일
0

코딩테스트(python)

목록 보기
3/22

프로그래머스

1단계_신규 아이디 추천

def solution(new_id):
    id_list = "abcdefghijklmnopqrstuvwxyz0123456789-_."
    answer = ''
    
    #1단계
    new_id = new_id.lower()
    
    #2단계
    answer = ''.join(i for i in new_id if i in id_list)
    
    #3단계
    while '..' in new_id:
        answer = answer.replace('..', '.')
    
    #4단계
    answer = answer.strip('.')
    
    #5단계
    if answer == '':
        answer = 'a'
    
    #6단계
    if len(answer) >= 16:
        answer = answer[:15].rstrip('.')
        
    #7단계
    while len(answer) <= 2:
        answer += answer[-1]
    
    return answer

: 테스트 케이스 5개 중 4개 통과. 한개는 시간 초과..! 더 짧은 코드는 없을까?

다른 사람 풀이(프로그래머스

def solution(new_id):
    answer = ''
    # 1
    new_id = new_id.lower()
    # 2
    for c in new_id:
        if c.isalpha() or c.isdigit() or c in ['-', '_', '.']:
            answer += c
    # 3
    while '..' in answer:
        answer = answer.replace('..', '.')
    # 4
    if answer[0] == '.':
        answer = answer[1:] if len(answer) > 1 else '.'
    if answer[-1] == '.':
        answer = answer[:-1]
    # 5
    if answer == '':
        answer = 'a'
    # 6
    if len(answer) > 15:
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:-1]
    # 7
    while len(answer) < 3:
        answer += answer[-1]
    return answer

: #4에서 if문을 또 쓰는 이유 : #4에서 문자열이 '.'인 경우 즉, len(answer) = 1인 경우 슬라이싱에서 오류가 발생하기 때문입니다! 뒷 코드에서 마지막에 오는 '.'을 제거할 때 제거하겠다는거죠

# 1. 대문자 -> 소문자
def step1(id):
    return id.lower()


# 2. 소문자, 숫자, 빼기, 밑줄 제외하고 제거
def step2(id):
    result = ""
    for c in id:
        # 알파벳이 아니고, -_.이 아니면 패스 나머지는 추가
        if ((not c.isalnum()) and (c != "-" and c != "_" and c != ".")):
            pass
        else:
            result += c
    return result


# 3. 마침표가 2번이상 연속된부분을 하나로 치환
def step3(id):
    result = id[0]
    for c in id[1:]:
        print(c)
        # result의 가장 마지막 부분이 .이고 추가할 문자가 .이면 추가안함. 나머지는 추가
        if (result[-1] == "." and c == "."):
            pass
        else:
            result += c
    return result


# 4. 마침표가 처음이나 끝에 위치한다면 제거
def step4(id):
    # 길이가 1이상인지 확인
    if(len(id)>1):
        # 처음 확인
        if (id[0] == "."):
            id = id[1:]
        # 마지막 확인
        if (id[-1] == "."):
            id = id[:-1]
    else:
        # 길이가 1이하이고, 문자가 .이라면 빈 문자열 대입
        if(id == "."):
            id = ""
    return id


# 5. 빈 문자열이라면 "a"리턴
def step5(id):
    if (len(id) == 0):
        return "a"
    else:
        return id


# 6. 아이디가 16자 이상이면 15개만 남김
def step6(id):
    if (len(id) >= 16):
        result = id[:15]
        # 15개 자른 문자중 마지막이 .이면 제거
        if(result[-1] == "."):
            return result[:-1]
        else:
            return result
    else:
        return id


# 7. id가 2자 이하라면 마지막 문자를 길이 3이될때까지 붙혀줌.
def step7(id):
    if (len(id) <= 2):
        last = id[-1]
        while (len(id) < 3):
            id += last
    return id


def solution(new_id):
    id = step1(new_id)
    id = step2(id)
    id = step3(id)
    id = step4(id)
    id = step5(id)
    id = step6(id)
    id = step7(id)
    return id

: 모든 과정을 함수로 만드신..분..

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개의 댓글