[프로그래머스] 신규아이디 추천-Python

코린이·2022년 5월 21일
1

프로그래머스

목록 보기
2/22

"신규아이디 추천" 문제

프로그래머스 문제 링크

🔎 풀이

사용언어 : python
re.sub 함수와 정규표현식을 이용하여 푸는게 Best지만! 어려워 일부분만 적용했습니다.🤣

re.sub은 문자열에서 특정 문자를 치환하는 함수로
re.sub('패턴','새로운패턴(바꿀패턴)','문자열') 이렇게 사용할 수 있습니다.

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
=> 문자열.lower()를 사용하여 모든 대문자를 소문자로 치환

2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(), 마침표(.)를 제외한 모든 문자를 제거합니다.
=> re.sub(r'[^a-z0-9-
.]', '', new_id)
=> 정규표현식을 이용
=> 대괄호([])속 ^ 는 제외를 의미한다.

3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
=> re.sub(r'[.]{2,}', '.', new_id)
=> 정규표현식 이용
=> {2,}은 '.'이 2개 이상을 의미

4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
=> new_id = new_id.strip('.')
=> strip() 함수는 문자열 앞뒤에서 주어진 문자를 제거

5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
=> if문 사용

6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
=> if문 사용

7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
=> while문으로 반복

💡 코드

import re

def solution(new_id):
    new_id = new_id.lower()  # 1단계
    new_id = re.sub(r'[^a-z0-9-_.]', '', new_id)  # 2단계
    new_id = re.sub(r'[.]{2,}', '.', new_id)  # 3단계
    print(new_id)
    new_id = new_id.strip('.')

    if len(new_id) == 0:
        new_id = "a"
    if len(new_id) >= 16:
        new_id = new_id[:15]
        if new_id[-1] == ".":
            new_id = new_id[:-1]
    while len(new_id) <= 2:
        new_id = new_id + new_id[-1]

    answer = new_id
    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
초보 개발자

2개의 댓글

comment-user-thumbnail
2022년 7월 14일

정규식 엔진은 python의 in 키워드보다 느려서, 패턴이 복잡해지는 경우 c나 java가 아니라 python보다 느려질 수 있어요.
문자열 매칭 및 치환과 관련된 github repo 참고해서 공부하면 도움이 될 것 같아 공유드립니다. 🙂

https://github.com/vi3k6i5/flashtext

주의

flashtext는 word to word replace 만 제공합니다.

1개의 답글