[프로그래머스] Lv.1 신규 아이디 추천 python

gong_ryong·2023년 3월 16일
0

프로그래머스

목록 보기
4/15

문제 링크

1. 문제 설명

신규 유저가 입력한 아이디가 new_id 라고 한다면,

1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.

따라서 신규 유저가 입력한 new_id가 "...!@BaT#*..y.abcdefghijklm"일 때,
네오의 프로그램이 추천하는 새로운 아이디는 "bat.y.abcdefghi" 입니다.

2. 문제 풀이

import re

def solution(new_id):
    # 1단계: 대문자를 소문자로 치환
    new_id = new_id.lower()
    
    # 2단계: 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
    new_id = re.sub('[^a-z0-9-_.]', '', new_id)
    
    # 3단계: 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
    new_id = re.sub('\.+', '.', new_id)
    
    # 4단계: 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
    new_id = re.sub('^\.|\.$', '', new_id)
    
    # 5단계: 빈 문자열이라면, new_id에 "a"를 대입합니다.
    if new_id == '':
        new_id = 'a'
    
    # 6단계: 길이가 16자 이상이면, 첫 15개의 문자를 제외한 나머지 문자 제거 및 마지막 마침표(.)를 제거합니다.
    if len(new_id) >= 16:
        new_id = new_id[:15]
        new_id = re.sub('\.$', '', new_id)
    
    # 7단계: 길이가 2자 이하라면, 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
    while len(new_id) < 3:
        new_id += new_id[-1]
    
    return new_id

물론 각 단계별로 for 문을 이용한 조건식을 이용한 풀이도 가능합니다! 하지만 각 단계별로 for문에 range에 조건문까지 달려있는 코드의 길이가 얼마나 늘어질지 상상이 되시나요? 저도 처음에는 그런 원시적인 방식으로 접근을 했다가 난잡한 코드와 끝없는 에러에 호되게 당하고 나서야 정규식을 배워야 겠다는 교훈을 얻었답니다.

그러면 각 단계별로 정규식을 이용한 풀이를 설명해 드릴게요~

# 2단계: 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
   new_id = re.sub('[^a-z0-9-_.]', '', new_id)

re.sub()을 이용해 문자열에서 대체할 대상을 정규식을 사용해 정의합니다. re.sub('조건식', '대체', 대체된 문자열)과 같이 사용할 수 있습니다.
[^조건]은 조건을 만족하지 않은 문자열을 찾아냅니다. 소문자 : a-z, 숫자 : 0-9와 문제에서 요구한 -_.을 넣어 이들을 포함하지 않은 문자를 공백으로 대체하여 제거합니다.
^은 문자열 시작 부분을 표현하는 조건식으로 혼동하지 않도록 주의합시다.

 # 3단계: 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
    new_id = re.sub('\.+', '.', new_id)

\ 는 뒤에 이어지는 조건식과 match되는 문자열을 찾아냅니다. 문자 뒤에 +를 붙이면 문자가 여러 번 반복된 부분을 찾을 수 있습니다. 따라서 '\.+'으로 연속한 마침표(.)가 있는 문자열을 찾을 수 있습니다.

# 4단계: 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
    new_id = re.sub('^\.|\.$', '', new_id)

여러 개의 조건을 한 줄로 나타낼 때에는 |을 사용하면 됩니다. ^는 시작 부분에 붙여 문자열 처음을 나타낸다면, $는 끝 부분에 붙여 문자열 끝을 나타냅니다. 따라서 '^\.|\.$'은 시작 또는 끝에 있는 마침표를 찾아냅니다.

이외의 단계는 정규식을 사용하지 않고 풀 수 있습니다. 정규식을 배워볼 수 있는 좋은 기회가 되어쎈요!

profile
비전공자의 비전공자를 위한 velog

0개의 댓글