반응형
programmers.co.kr/learn/courses/30/lessons/72410
def solution(new_id):
new_id = new_id.lower()
re = ''
for char in new_id:
if char.isalnum() or char in "-_.":
re += char
del_dot = ''
for char in re:
if not del_dot:
del_dot += char
continue
if del_dot[-1]=='.' and char=='.':
continue
else:
del_dot += char
if del_dot and del_dot[-1] == '.':
del_dot = del_dot[:-1]
if del_dot and del_dot[0] == '.':
del_dot = del_dot[1:]
if not del_dot:
del_dot = 'a'
if len(del_dot)>=16:
del_dot = del_dot[:15]
if del_dot[-1]=='.':
del_dot = del_dot[:-1]
if len(del_dot)<=2:
del_dot += del_dot[-1]
del_dot += del_dot[-1]
del_dot = del_dot[:3]
return del_dot
풀긴하였지만 굉장히 시간이 많이 소요됐다. 실전이었으면 못풀었다.
구현문제가 생각할 것도 많고 예외도 많아서 정말 어려운 것 같다.
<개선할 점>
3단계 개선: 반복되는 2개 이상의 점 '..' ->'.' 으로 줄이기 => 아래처럼 while과 replace()를 쓰면 매우 쉽게 할 수 있다..
### before ####
del_dot = ''
for char in re:
if not del_dot:
del_dot += char
continue
if del_dot[-1]=='.' and char=='.':
continue
else:
del_dot += char
### after ####
while '..' in re:
re = re.replace('..','.')
5단계 개선: 이 정도는 한줄로도 가능하다.
### before
if not del_dot:
del_dot = 'a'
### after
del_dot = 'a' if not del_dot else del_dot
6단계 개선: 슬라이싱은 인덱스 예외 에러가 나지 않기때문에 if 조건문은 사실 필요없다.
#### before ####
if len(del_dot)>=16:
del_dot = del_dot[:15]
if del_dot[-1]=='.':
del_dot = del_dot[:-1]
#### after ####
del_dot = del_dot[:15]
if del_dot[-1]=='.':
del_dot = del_dot[:-1]
최종:
def solution(new_id):
new_id = new_id.lower()
re = ''
for char in new_id:
if char.isalnum() or char in "-_.":
re += char
while '..' in re:
re = re.replace('..','.')
if re[-1] == '.':
re = re[:-1]
if re and re[0] == '.':
re = re[1:]
re = 'a' if not re else re
re = re[:15]
if re[-1]=='.':
re = re[:-1]
if len(re)<=2:
re += re[-1]
re += re[-1]
re = re[:3]
return re
다른 사람 풀이보면 정규식을 활용해서 기가 막히게 풀었다. 정규식을 잘 알면 문자열 관련 구현 문제에서 큰 힘을 발휘할 수 있을 것 같다.
댓글