알고리즘 풀이
[알고리즘] 프로그래머스 | 신규 아이디 추천
째깍단
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:]
정규식으로 풀이하는 문제라서 새로웠다.
풀이를 보다보니 정규식을 사용하지 않고 풀이한 방법도 있었다.
보다 복잡하고 오래 걸리는 코드여서 기술을 아는 것의 중요성을 느꼈다.