알고리즘 풀이

[알고리즘] 프로그래머스 | 신규 아이디 추천

째깍단 2023. 8. 17. 08:17

제목+링크

답: 

더보기
import re
 
def solution(new_id):
    text = new_id
    text = text.lower()
    text = re.sub('[^a-z\d\-\_\.]', '', text) 
    text = re.sub('\.\.+', '.', text)
    text = re.sub('^\.|\.$', '', text)
    if text == "":
        text = "a"
    text = re.sub('^\.|\.$', '', text[:15]) 
    while len(text) < 3:
        text += text[-1:]
    return text

 

 

약간의 리팩터링

import re
 
def solution(new_id):
    text = new_id
    text = re.sub('[^a-z\d\-\_\.]', '', text.lower()) 
    text = re.sub('\.\.+', '.', text)
    text = re.sub('^\.|\.$', '', text)
    text = "a" if text == "" else re.sub('\.$', '', text[:15]) 
    while len(text) < 3:
        text += text[-1:]
    return text

 

 

문제 분석 및 해석

조건에 맞게 신규 아이디를 추전해주도록 한다.

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이 될 때까지 반복해서 끝에 붙입니다.

 

풀이를 차례로 알려주는 문제여서, 정규식에 대해 공부하고 적용하였다,

 

 

 

 

리뷰.

차례로 한단계씩 풀어나갔다.

 

정규식에 익숙하지 않아 처음 작성할때는 모두 '[\.]' 이렇게 대괄호에 들어가있어야하는 줄 알았는데,

이때문에 제대로 마침표를 제거하지 못하는 오류가 났었다.

 

정규식에서의 [] 대괄호는 괄호 안에 든 문자나 숫자 등 조건 중 무언가가 있는지 확인하는 것이다.

 

import re
 
def solution(new_id):
    text = new_id
    #1단계 소문자 치환
    text = text.lower()
    
    #2단계 소문자, 숫자, - _ . 제외 지우기 ##\d는 숫자, \는 이스케이프
    text = re.sub('[^a-z\d\-\_\.]', '', text) 
    
    #3단계 .가 2번이상 반복 - 하나의 마침표로 치환
    text = re.sub('\.\.+', '.', text)  #정규식 +면 반복확인
    
    #4단계 처음이나 끝에 .가 있으면 제거
    text = re.sub('^\.|\.$', '', text) #^는 시작, $는 끝
    
    #5단계 빈 문자열이면 a를 대입
    if text == "":
        text = "a"

 

 

 

6단계 1줄로 줄임

    #6단계 16자 이상이면 15개. 나머지 제거 + .마침표가 15번째면 제거
    if len(text) >= 16:
        text = text[:15] 
    text = re.sub('^\.|\.$', '', text)

 

    #6단계 16자 이상이면 15개. 나머지 제거 + .마침표가 15번째면 제거
    text = re.sub('^\.|\.$', '', text[:15])

 

 

 

 

7단계도 while문으로 조건을 검사하고 추가하는 형식으로 변경

	#7단계 new_id가 2자 이하면 마지막 문자를 new_id가 3이될 때까지 붙임
    if len(text) < 3:
        char = text[-1]
        while len(text) < 3:
            text += char
    while len(text) < 3:
        text += text[-1:]

 

 


정규식으로 풀이하는 문제라서 새로웠다.

풀이를 보다보니 정규식을 사용하지 않고 풀이한 방법도 있었다.

 

보다 복잡하고 오래 걸리는 코드여서 기술을 아는 것의 중요성을 느꼈다.