문제
요약
- 대문자를 소문자로 치환
- 소문자, 숫자, -, _, . 를 제외한 모든 문자 제거
- 마침표(.) 가 2번 이상 연속되면 하나로 치환
- 처음이나 끝에 마침표(.)가 나타나면 제거
- 빈 문자열이라면 “a” 추가
- 길이가 16 이상이면, 첫 15개 문자만
- 길이가 2자 이하면 마지막 문자를 길이가 3이 될 때까지 반복해서 더함.
분류
- 문자열
- 정규표현식
풀이
1. 내 풀이
- 야매로 하라는 거 했다. (쓰레기 풀이라는 뜻)
def solution(new_id):
new_id = list(new_id.lower()) #1단계
special = ['~','!','@','#','$','%','^','&','*','(',')','=','+','[','{',']','}',':','?',',','<','>','/'] #1단계
arr = []
key = False
l = len(new_id)
for i in range(l):
if new_id[i] not in special : #2단계
if new_id[i] == '.' :#3단계
if key:
continue
else:
arr.append(new_id[i])
key = True
continue
else:
key = False
arr.append(new_id[i])
if len(arr) != 0 and arr[0] == '.' : del arr[0] #4단계
if len(arr) != 0 and arr[-1] == '.' : del arr[-1]
if len(arr) == 0: arr.append('a') #5단계
if len(arr) >= 16: #6단계
arr = arr[:15]
if arr[-1] == '.': del arr[-1]
while len(arr) < 3: # 7단계
arr.append(arr[-1])
return ''.join(arr)
2. 프로그래머스 좋아요 많은 풀이
1. 최적화
def solution(new_id):
answer = ''
# 1
new_id = new_id.lower()
# 2
for c in new_id:
if c.isalpha() or c.isdigit() or c in ['-', '_', '.']:
answer += c
# 3
while '..' in answer:
answer = answer.replace('..', '.')
# 4
if answer[0] == '.':
answer = answer[1:] if len(answer) > 1 else '.'
if answer[-1] == '.':
answer = answer[:-1]
# 5
if answer == '':
answer = 'a'
# 6
if len(answer) > 15:
answer = answer[:15]
if answer[-1] == '.':
answer = answer[:-1]
# 7
while len(answer) < 3:
answer += answer[-1]
return answer
2. 정규 표현식 이용
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