[코딩테스트][프로그래머스] 신규아이디 추천 -정규식 표현의 중요성
https://programmers.co.kr/learn/courses/30/lessons/72410
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
[코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr](https://programmers.co.kr/learn/courses/30/lessons/72410)
정규식을 이용한다면 간단한 코드가 되지만
나처럼 정규식이란 개념자체를 까먹은 사람은 줄기차게 if 조건문을 이용하거나 여러 노동을 해야할 것이다.
그럼에도 나의 코드를 올리는 것은 내가 이런 복잡한 거미줄같은 걸 만들었다는 걸 기록해두기 위해서다.
1. 나의 코드
코드
def solution(new_id):
a="~!@#$%^&*()=+[{]}:?,<>/"
b=list(a)
# 1단계
c=list(new_id.lower())
# 2단계
for i in b :
while i in c:
c.remove(i)
e="".join(c)
# 3단계
while "..." in e or ".." in e:
if "..." in e or ".." in e:
f=e.replace("...",".")
g=f.replace("..",".")
e=g
else :
break
h=list(e)
# 4단계
if len(h) == 0 :
answer="a"*3
elif h[0] =="." :
h.remove(h[0])
if h == [] :
answer= "a"*3
elif h[-1] =="." :
h.pop()
elif h[-1] == "." :
h.pop()
# 5단계
if h == [] :
answer= "a"*3
elif len(h)>15 :
h=h[:15]
if h[-1] == ".":
h.pop()
answer="".join(h)
# 6 단계
elif len(h)<3:
while len(h) != 3 :
h.append(h[-1])
answer="".join(h)
else :
if h[-1] == "." :
h.pop()
answer="".join(h)
return answer
여러가지 테스트 케이스를 추가하고 또 추가해야지 완성할 수 있었다.
2. 정규식을 이용한 코드
정규식을 복습하자
정규식 모듈을 불러온다.
import re
아래가 메타문자이고
. ^ $ * + ? { } [ ] \ | ( )
각각의 메타문자들이 의미하는 바가 있다.
[ ] : 문자클래스
어떠한 문자열 str1 = ""이 있다고 치자
만일 [abcde] 라고 표현된 식이 있다면 str1내에 'a,b,c,d,e,' 중 하나라도 들어 있다면 str1은 매치가 된다.
- 일일이 쓰지 않고 범위로 나타낼 수도 있다. [0-9] 은[0123456789] 이고 [a-f] 은 [abcdef] 처럼
- not을 의미하는 ^을 쓰면 포함된 문자들을 제외한 문자만 매치한다는 뜻이다.
-\d
=[0-9]
-\D
=[^0-9]
-\s
=[\t\n\r\f\v]
기타 등등이 있다.
sub() : 문자열 바꾸기
re.sub('[^a-z0-9\-_.]', '', st)
st에 저장된 문자열 중 숫자와 소문자 알파벳 [ \,-,_,.]을 제외한 문자열을 모두 지워버린다.
re.sub('\.+', '.', st)
"." 가 중복되는 모든 문자열을 "."으로 바꾼다.
re.sub('^[.]|[.]$', '', st)
문자열 시작^이 "." 이거나 문자열 끝$이 "."이면 지운다.
'a' if len(st) == 0 else st[:15]
문자열이 없으면 "a"로 대체하고 아니면 문자열 15자 까지 자른다.
자르고나서 다시 시작과 끝을 검사하고
st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
만일 문자열의 갯수가 3이상이면 그래도 출력
아니면 문자열 최소 3이 되도록 반복해서 더한다.