코드
def solution(new_id):
# 1단계: 소문자로 치환
new_id = new_id.lower()
# 2단계: 특수문자 제거
for i in new_id:
if i in '~!@#$%^&*()=+[{]}:?,<>/':
new_id = new_id.replace(i, '')
# 3단계 ..., ..을 .으로 치환
while '..' in new_id:
new_id = new_id.replace('..', '.')
# 4단계: 처음 또는 끝에 위치한 . 제거
new_id = new_id.strip('.')
# 5단계: 빈 문자열이면 'a' 추가
if len(new_id) == 0: new_id += 'a'
# 6단계: 16자 이상이면 15자 이후의 문자 모두 제거
if len(new_id) >= 16:
new_id = new_id[:15]
new_id = new_id.rstrip('.') # 15자 이후 문자 제거 후 .이 끝에 위치하면 . 제거
# 7단게: 2자 이하이면 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙임
if len(new_id) <= 2:
while(len(new_id) <= 2):
new_id += new_id[-1]
return new_id
문제가 길면 갑자기 난독증이 생기는 나도 주어진 단계를 차근차근히 따라가며 어렵지 않게 풀 수 있는 문제였다.
7단계의 가이드 중 2, 3단계를 어떻게 푸느냐가 핵심인 것처럼 느껴졌다.
정규표현식이 익숙하지 않아 최대한 아는 선에서 해결해보려 했지만 3단계에서 좌절을 느끼고 있었다.
마침표(.)가 2개 이상 존재하는 경우에 모두 1개로 바꿔줘야 하는데 어떻게 2개 이상인지 알 수 있을까 하다가 생각이 떠올랐다.
만약, ...과 같이 마침표가 3개인 경우에 ..을 .으로 바꾸면 어떻게 될까?
...은 ..이 될 것이고, 그럼 다시 ..을 .으로 바꾸면 된다.
마침표가 4개인 ....이면 ..이 될 거고 다시 ..을 .으로 바꾸면 된다.
while문을 사용해 아이디에 ..이 존재하면 .으로 바꿔주는 것을 반복하면 되는 것이었다.
3단계를 정규표현식으로 나타내면 다음과 같이 나타낼 수 있다.
new_id = re.sub('\.+','.', new_id)
일단 마침표가 1개 이상이면 모두 마침표 1개로 바꾸는 것으로 한다. 그럼 1개 이상을 의미하는 +를 사용하면 된다.
하지만 정규표현식에서 .은 모든 문자를 의미한다. 그럼 어떻게 우리가 의도하는 마침표를 의미하게 할 수 있을까?
\.과 같이 역슬래시(\)를 앞에 써주거나 [.]처럼 대괄호 안에 넣어주면 된다.
반응형