2022.06.24.

프로그래머스 '신규 아이디 추천' 문제 피드백

 

 

 

 

 

1번째 시도: 성공

 

def solution(new_id):
        
    # 1단계
    answer = new_id.lower()
    
    # 2단계
    allowed = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
               'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
               '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '_', '.']
    
    not_allowed = []
    for i in set(answer):
        if i not in allowed:
            not_allowed.append(i)
    for i in not_allowed:
        answer = answer.replace(i, '')
    
    # 3단계
    check = 0
    while (check == 0):
        if '..' in answer:
            answer = answer.replace('..', '.')
        else:
            check = 1
    
    # 4단계
    answer = answer.strip('.')
    
    # 5단계
    if answer == '':
        answer = 'a'
        
    # 6단계
    answer = answer[0:15]
    answer = answer.rstrip('.')
    
    # 7단계
    if len(answer) == 1:
        answer = answer + answer + answer
    if len(answer) == 2:
        answer = answer + answer[-1:]

    return answer

 

마침표 여러 개를 마침표 하나로 치환하는 것을 잘 고려해야 한다.

 

  • answer.replace(x, y) : x를 y로 치환

 

Method Description Example
strip( ) 문자열 양 끝에 있는 공백을 모두 지움 '    A    '.strip( ) => A
strip( 'x' ) 문자열 양 끝에 있는 'x'를 모두 지움 'xxAxx'.strip( 'x' ) => A
lstrip( 'x' ) 문자열 왼쪽 끝에 있는 'x'를 모두 지움 'xxAxx'.lstrip( 'x' ) => Axx
rstrip( 'x' ) 문자열 오른쪽 끝에 있는 'x'를 모두 지움 'xxAxx'.rstrip( 'x' ) => xxA

 

 

 

 

 

 

 

 


 

 

 

 

 

모범 답안 (1)

 

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

 

다양한 정규식을 쓴 코드

 

 

그런데 실행 시간은 오히려 더 많이 나왔다.

 

 

 

 

 

모범 답안 (2)

 

    # 2단계
    answer = ''
    for i in new_id:
        if i.isalpha() or i.isdigit() or i in ['-', '_', '.']:
            answer += i
    
    # 3단계
    while '..' in answer:
        answer = answer.replace('..', '.')

 

2단계는 이 코드보다 내 코드의 실행 시간이 훨씬 더 짧다.

 

3단계는 이 코드가 더 간결하고 좋은 것 같다.

 

Method Is every character ...? Example
isalpha( ) alphabetic (A-Z, a-z)  
isalnum( ) alpha-numeric (A-Z, a-z, 0-9) 'Apple3'.isalnum( ) => T
'an apple'.isalnum( ) => F
isdigit( ) numeric (0-9) '2014'.isdigit( ) => T
'9:30'.isdigit( ) => F
isspace( ) whitespace character ('  ', '\n', '\t', '\r') '\n \t \r \n'.isspace( ) => T
'a p p l e'.isspace( ) => F
islower( ) lowercase (a-z) 'apple'.islower( ) => T
'Apple'.islower( ) => F
isupper( ) uppercase (A-Z) 'APPLE'.isupper( ) => T
'Apple'.isupper( ) => F

 

 

 

 

 

참고: https://sites.pitt.edu/~naraehan/python3/string_methods2.html

복사했습니다!