[Programmers] 신규 아이디 추천 (문자열 Lv.1) - Python

꼬마요리사레미·2023년 5월 30일

Algorithm

목록 보기
32/41

1. 문제


신규 아이디 추천

2. 풀이


코드
import re

def solution(new_id):
    # 1단계: 소문자로 변환
    new_id = new_id.lower()

    # 2단계: 허용되는 문자 제외 제거
    new_id = re.sub(r"[^a-z0-9-_.]", "", new_id)

    # 3단계: 연속된 마침표 하나로 치환
    new_id = re.sub(r"\.+", ".", new_id)

    # 4단계: 처음과 끝의 마침표 제거
    new_id = new_id.strip(".")

    # 5단계: 빈 문자열이면 "a" 대입
    if len(new_id) == 0:
        new_id += "a"

    # 6단계: 길이가 16 이상이면 첫 15개 문자만 유지
    if len(new_id) >= 16:
        new_id = new_id[:15]
        new_id = new_id.rstrip(".")

    # 7단계: 길이가 2자 이하라면 마지막 문자를 반복하여 길이가 3이 될 때까지 추가
    while len(new_id) <= 2:
        new_id += new_id[-1]

    return new_id
입력 및 출력
new_id = "...!@BaT#*..y.abcdefghijklm"

>> "bat.y.abcdefghi"

3. 로직


  1. 소문자로 변환: new_id의 모든 알파벳을 소문자로 변환한다.

  2. 허용되는 문자 제외 제거: 알파벳 소문자, 숫자, "-", "_", "."를 제외한 모든 문자를 제거한다.

  3. 연속된 마침표 하나로 치환: new_id에서 연속된 마침표를 하나로 치환한다.

  4. 처음과 끝의 마침표 제거: new_id의 처음과 끝에서 마침표를 제거한다.

  5. 빈 문자열이면 "a" 대입: 만약 new_id가 빈 문자열이라면, "a"를 대입한다.

  6. 길이가 16 이상이면 첫 15개 문자만 유지: new_id의 길이가 16 이상이면 처음부터 15개의 문자만 유지하고, 마지막 문자가 마침표인 경우에는 제거한다.

  7. 길이가 2자 이하라면 마지막 문자를 반복하여 길이가 3이 될 때까지 추가: new_id의 길이가 2자 이하라면 마지막 문자를 반복하여 길이가 3이 될 때까지 추가한다.

4. 사용된 함수


re.sub()

re.sub() 함수는 정규 표현식을 사용하여 문자열에서 패턴을 검색하고, 해당 패턴을 다른 문자열로 치환하는 기능을 제공한다. 여기서 re는 Python 내장 모듈 중 하나로, 정규 표현식(Regular Expression)을 사용하여 문자열 패턴 매칭과 처리를 수행하는 기능을 제공한다. re 모듈을 사용하려면 코드 상단에 import re 문을 추가해야 한다.

re.sub() 함수의 구문은 다음과 같다:

new_string = re.sub(pattern, repl, string)
  • pattern: 검색할 패턴을 지정하는 정규 표현식이다.
  • repl: 치환할 문자열이나 치환 함수를 지정한다. 만약 문자열을 지정하면, 패턴과 일치하는 부분이 해당 문자열로 치환된다. 또는 치환 함수를 지정할 수 있으며, 이 함수는 매칭된 객체를 입력으로 받아 새로운 문자열로 반환해야 한다.
  • string: 대상 문자열이다. pattern을 검색하여 치환할 부분을 찾는다.

re.sub() 함수는 string에서 pattern과 일치하는 부분을 찾아 repl로 지정된 문자열로 치환한다. 여러 개의 일치하는 패턴이 있는 경우, 모든 패턴이 치환된다. 반환값은 치환된 결과 문자열이다.

다음은 re.sub() 함수의 사용 예시이다:

import re

string = "Hello, 123 World!"
new_string = re.sub(r"\d+", "*", string)
print(new_string) #"Hello, * World!

replace()와 차이

replace()re.sub() 함수는 문자열에서 특정 패턴을 찾아 다른 문자열로 치환하는 데 사용되지만, 동작 방식과 사용 목적에서 차이가 있다.

replace() 함수는 문자열 내에서 특정 문자 또는 문자열을 다른 문자열로 단순히 대체하는 데 사용된다. 예를 들어, "Hello, World!".replace("World", "Python")는 문자열 "Hello, World!"에서 "World""Python"으로 대체하여 "Hello, Python!"을 반환한다. replace()는 정규 표현식을 지원하지 않으며, 단순한 문자열 치환에 사용된다.

반면에 re.sub() 함수는 정규 표현식을 사용하여 더 복잡한 패턴을 검색하고 대체하는 데 사용된다. 이 함수는 문자열에서 패턴을 찾아 해당 패턴을 다른 문자열로 치환한다. 예를 들어, re.sub(r"\d+", "*", "Age: 25")는 문자열 "Age: 25"에서 숫자를 "*"로 대체하여 "Age: *"를 반환한다. re.sub()은 정규 표현식을 활용하여 패턴 매칭과 치환 작업을 수행하며, 더욱 다양한 패턴 처리에 유용하다.

따라서, 간단한 문자열 대체 작업에는 replace()를 사용하고, 정규 표현식을 활용하여 복잡한 패턴을 대체해야 할 때에는 re.sub()를 사용하는 것이 일반적인 패턴이다.

0개의 댓글