[프로그래머스] 신규 아이디 추천 - 문자열 변형

zunzero·2022년 8월 28일
0

알고리즘(파이썬)

목록 보기
44/54

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

해당 규칙에 맞춰 차근차근 아이디를 변형하면 되는 간단한 문제이다.

문자열 변형 관련해서 많은 메서드들을 알게 된 문제이다.

def solution(new_id):
    rule = ['.', '-', '_']
    # 1, 2단계
    for i in new_id:
        if i.isupper():
            new_id = new_id.replace(i, i.lower())
        elif i.islower():
            continue
        elif i.isdigit():
            continue
        elif i not in rule:
            new_id = new_id.replace(i, "")
    # 3단계
    while '..' in new_id:
        new_id = new_id.replace("..", ".")
    # 4단계
    new_id = new_id.strip(".")
    # 5단계
    if new_id == "":
        new_id += 'a'
    # 6단계
    if len(new_id) >= 16:
        new_id = new_id[:15]
    new_id = new_id.rstrip(".")
    # 7단계
    if len(new_id) <= 2:
        while len(new_id) < 3:
            new_id += new_id[-1]
    answer = new_id
    print(answer)
    return answer

isupper(), islower(), upper(), lower()

대문자이거나 소문자인지 확인하고, 대문자로 혹은 소문자로 바꿔주는 메서드들이다.

replace

문자열에서 특정 문자를 따로 삭제할 때는 remove와 같은 것들을 사용하진 않는다.
배열에서의 삭제와는 조금 다르게 replace 메서드들을 사용한다.
다른 문자로 치환하고 싶으면 replace('a', 'b'), 삭제하고 싶으면 replace('a',"")와 같이 사용하면 된다.

strip(), lstrip(), rstrip()

문자열의 양끝에 특정 문자를 지우고 싶을 때 사용한다.
문자열 양 끝에 빈칸들을 삭제하고 싶으면 strip메서드를 그대로 사용하면 된다.
특정 문자들을 삭제하고 싶으면 strip('a''b''c')와 같이 사용하면 된다.

슬라이싱 같은 경우는 배열과 똑같다.

re

re 라이브러리를 사용하면 여러 문자열을 삭제할 수 있다.

import re
text = "abc123def456ghi00"
alpha_text = re.sub(r"[a-z]", "", text)
print(alpha_text)
# abcdefghi

zero_digit_text = re.sub(r"[1-9]", "", text)
print(zero_digit_text)
# 12345600

digit_text = re.sub(r"[0-9]", "", text)
print(digit_text)
# 123456

re.sub의 첫 인수에는 정규표현식이 들어간다.
정규표현식에 대해서는 나중에 자세히 알아보자!

아래는 정규표현식을 사용한 모범답안이다.

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