KEEP GOING

[python] 프로그래머스 72410번 : 신규 아이디 추천 (isdigit(), isalpha()) 본문

code review/implementation

[python] 프로그래머스 72410번 : 신규 아이디 추천 (isdigit(), isalpha())

jmHan 2022. 3. 17. 17:08
반응형

https://programmers.co.kr/learn/courses/30/lessons/72410

 

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

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

[구현]

문자열.replace('a', 'b') : sorted() 처럼 return 값이 존재하므로 반드시 변수에 저장

문자열 = 문자열.replace('..', '.')

 

# 3단계
    while '..' in new_id:
        new_id.replace('..', '.')
=> 문자열에 '..'가 존재하는 경우, 무한루프 발생...

[코드 구현]

def solution(new_id):
    answer = ''
    # 1단계
    new_id = new_id.lower()
    # 2단계
    tmp = ''
    for s in new_id:
        if s in [str(i) for i in range(10)]:
            tmp += s
        if 97 <= ord(s) <= 122 or s in ['-', '_', '.']:
            tmp += s
    new_id = tmp
    # 3단계
    while True:
        if '..' in new_id:
            new_id = new_id.replace('..', '.')
        else:
            break
    # 4단계
    if new_id[0] == '.':
        new_id = new_id[1:]
    if len(new_id) >=2 and new_id[-1] == '.':
         new_id = new_id[:-1]
    if len(new_id) == 1 and new_id[-1] == '.':
         new_id = ''
    # 5단계
    if new_id == '':
        new_id = 'a'
    # 6단계
    while 16 <= len(new_id):
        new_id = new_id[:-1]
        if new_id[-1] == '.':
            new_id = new_id[:-1]
    # 7단계
    while len(new_id) <= 2:
        new_id = new_id + new_id[-1]
    
    return new_id

 

[2,3,4단계 코드 개선]

문자열.isdigit() : 문자열이 숫자인지 확인하는 메소드

문자열.isalpha() : 문자열이 영어인지 확인하는 메소드

4단계에서 맨 앞 존재하는 '.'을 제거할 때 길이가 1 이상이면 그냥 남겨두고 

               맨 뒤에 존재하는 '.'이 존재하는 경우에 제거하도록 구현하면

if new_id[-1] == '.':
        new_id = new_id[:-1] 와 같이 처리 가능.

만약에 맨 앞 존재하는 '.'을 제거할 때 길이가 1이상이라는 조건없이 제거한다면 

new_id = '.' 일때 맨 뒤에 존재하는 '.'을 제거 할때 new_id[:-1]에서 인덱스 에러 발생 if new_id[-1] == '.':
        new_id = new_id[:-1]

IndexError: string index out of range 인덱스 에러 발생

6단계에서는 이미 길이가 16이상이라는 전제하에

길이가 15가 될 때까지 마지막 원소를 제거하므로 인덱스 에러가 발생할 이유가 없다.

 

[코드 개선]

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

 

 

반응형
Comments