코딩테스트

[코딩테스트][프로그래머스] 신규아이디 추천 -정규식 표현의 중요성

탱! 2022. 6. 16. 10:59

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이 되도록 반복해서 더한다.