📌문제 설명
📌제한 사항
newid는 길이 1 이상 1,000 이하인 문자열입니다.
new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.
new_id에 나타날 수 있는 특수문자는 -.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.
📌 Solution
이번 문제를 푸는 것은 문제의 조건에 맞게 차근차근 구현을 해나가면 되었다.
그러나 파이썬에 아직 익숙치 않아 여러 문자열 함수들을 사용해나가야했는데 아래와 같이 작성한 코드는 정답이긴 하지만 효율적이진 못한 부분이 있다.
def solution(new_id):
answer = ''
#1단계
answer=new_id.lower()
#2단계
s=list(answer)
i=0
while i < len(s):
now=ord(s[i])
if (now>=ord('a') and now<=ord('z')) or (now == ord('-')) or (now == ord('_')) or (now == ord('.')) or(now >=ord('0') and now <= ord('9')):
i=i+1
continue
else:
del(s[i])
answer="".join(s)
#3단계
while '..' in answer:
answer=answer.replace('..', '.')
#4단계
answer=answer.strip('.')
#5단계
if not answer:
answer='a'
#6단계
s=list(answer)
if len(s)>=16:
del(s[15:])
if s[14]=='.':
del(s[14])
#7단계
while len(s)<=2:
s.append(s[-1])
answer="".join(s)
return answer
그래서 아래의 코드를 참고해봤다.
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번의 기나긴 조건문이 아닌 애초부터 문자열로 받아들여서 isalpha(), isdigit()을 통하여 숫자인지 알파벳인지 구분하고 뒤의 in ['-', '_', '-']
를 통하여 확인하는 것이 가독성에 훨씬 도움되고 효율적인것을 알게 되었다.
✨ 문제 해결하며 알게 된 점