[프로그래머스] Lv.1 신규 아이디 추천 (Python)
이 문제는 조건에 따라 코드 작성만 해주면 되는 문제.
.lower()
, .isalpha()
, .isdigit()
같은 문자열에 쓰이는 메서드도 잊지말고 체크해두자.
def solution(new_id):
answer = ''
# 1: 모든 대문자를 대응되는 소문자로 치환
new_id = new_id.lower()
# 2: 알파벳 소문자, 숫자, - _ . 제외하고 모두 제거
# 위의 것들로만 이루어져 있지 않으면 제거
for n in new_id:
# 위의 것들로 이루어져 있으니까 answer에 +
if n.isalpha() or n.isdigit() or n in ['-','_','.']:
answer += n
# 3: 마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환
while '..' in answer:
answer = answer.replace('..', '.')
# 4: 마침표가 처음이나 끝에 위치한다면 제거
if answer[0] == '.':
# 문자열의 길이가 2이상이라면
if len(answer) > 1:
answer = answer[1:]
# 근데 아니라면 .이 남아있어야함(처음이자 마지막 문자가 될 수 있기 때문에)
else:
answer = '.'
if answer[-1] == '.':
answer = answer[:-1]
# 5: 빈 문자열이라면 a 대입
if answer == '':
answer += 'a'
# 6: 16자 이상이면, 15개의 문자를 제외한 나머지문자를 모두 제거
if len(answer) > 15:
answer = answer[:15]
# 만약 제거 후 마침표가 끝에 위치한다면 끝에 위치한 마침표문자를 제거
if answer[-1] == '.':
answer = answer[:-1]
# 7: new_id의 길이가 2자 이하라면, 마지막 문자를 길이가 3이 될 때 까지 반복해서 끝에 붙임
while len(answer) < 3:
answer += answer[-1]
return answer
주석에 조건 참고!
중간에 시행착오가 있었는데, 4번 조건
에서
if len(answer) > 1:
answer = answer[1:]
else:
answer = '.'
이부분이 없다면 List index Out of Range
라는 에러메시지가 뜬다. 주석에 적어놨다시피 문자열 길이가 .
으로 단 하나 남아있을 경우 처음이자 마지막 문자가 되기 때문에 생기는 에러. 이부분에서 한참을 헤맸다..😒 아직 이런 부분을 빨리빨리 생각해내기는 어려운 것 같다.
이 문제 풀면서 느낀점은 문제 길다고 쫄 필요가 없다는 것..
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
진짜 레전드풀이
프로그래머스에서 다른사람 풀이 보면 제일 위에 뜨는 풀이임!!
나는 사실 정규식 왜 배우나(ㅋㅋ;;ㅈㅅ합니다 강사님)생각했는데 이럴 때 쓰는거군🤔
사실 문제 다시 보면 제일 앞, 뒤에 포함되는지 이런거 따지는 문제라서 정규식이 바로 생각났어야 하는 것 같다. 막상 쓰려면 정규식 패턴이 생각 안나는게 문제지만..