티스토리 뷰

728x90

이번에 프로그래머스 여름방학 인턴을 지원해서 슬슬 알고리즘 문제를 풀어야할 것 같아서 시작했다.

정처기 실기도 공부해야하는데 아마 둘 다 잡으려다가 놓칠 것 같기도 하다..

열심히 해보자!!

728x90

문제에 대한 설명은 건너 뛰고 바로 코드부터 보자

 

아래의 코드가 내가 푼 코드이다.

차례차례 7단계까지 조건을 통과하면서 조건에 맞는 answer가 나온다.

결과만 보면 괜찮지만 다른 사람의 풀이를 한 번 보자

def solution(new_id):
    answer = ''
    new_id = new_id.lower()
    
    for word in new_id:
        if word.isalnum() or word in '-_.':
            answer += word
    
    while '..' in answer:
        answer = answer.replace('..', '.')
    
    if answer[0] == '.' and len(answer) > 1:
        answer = answer[1:]
    if answer[-1] == '.':
        answer = answer[:-1]
        
    if answer=='':
        answer = 'a'
        
    if len(answer)>=16:
        answer = answer[:15]
        if answer[-1] =='.':
            answer = answer[:-1]
            
    if len(answer)<3 :
        answer = answer + (3-len(answer))*answer[-1]
    
    return answer

 

이것은 다른 사람이 정규식을 이용해 푼 코드이다.

벌써 간결한 것이 느껴진다..

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

 

자세히 알아보자면

python에서는 정규식을 이용하여 문자 치환을 해결할 수 있다.

하지만 복잡하기 때문에 제대로 알고 있지 않으면 활용하기 힘들다..

 

 

 

그래서..

 

이번 기회에 정규식을 배워보자!

 

먼저 정규식에는 메타 문자라는 것이 있다.

메타 문자는 2가지로 나뉘는데 매치가 진행될 때 문자열이 바뀌는 것(소비한다라고도 한다)과 아닌 것이 있다.

 

|

or 과 같은 의미로 쓰인다.

^

문자열의 맨 처음을 뜻한다. 하지만 쓰이는 곳에 따라서 not의 의미를 가지기도 한다.

$

문자열의 시작을 뜻한다.

[ ]

문자 클래스를 뜻하며 이것이 감싸고 있는 것은 문자라는 것을 의미한다.

.

어떠한 문자를 의미하며 모든 문자를 의미하기도 한다.

말이 좀 애매한데 예시를 들자면

a.b 는 adb, apb, ab, a6b, a*b 등등 여러 문자와 같다는 의미가 된다.

*

반복을 의미하며 꼭 1번 이상이 아니라 0번이어도 된다.

a*b 는 b, ab, aab, aaaaab 등 여러 문자와 같다.

+

반복이긴 하나 1회 이상 반복을 해야한다.

a+b 는 b일 수 없다.

{m, n}

m번부터 n번 사이 반복을 의미한다. 리스트의 인덱싱처럼 사용할 수 있다.

ca{2,4}t = caat, caaat, caaaat 만 된다. cat은 a가 2번 이상 반복되지 않았기 때문에 속할 수 없다.

?

있어도 그만 없어도 그만이다.

 

 

그럼 다른 사람의 코드를 한 번 보겠다.

import re

def solution(new_id):
    st = new_id
    # 대문자를 소문자로 바꾸기
    st = st.lower()
    # ^ : [] 안에 있으니 not으로 사용, a-z : 알파벳 소문자, 0-9 : 숫자, \  : 특수문자 앞에 붙음
    st = re.sub('[^a-z0-9\-_.]', '', st)
    # .+ : .이 1개 이상 존재, 
    st = re.sub('\.+', '.', st)
    # ^ : [] 밖에 있으니 문자열의 맨 처음, $ : 문자열의 맨 뒤
    st = re.sub('^[.]|[.]$', '', st)
    # 길이가 0 이면 a 대입하고 아니면 슬라이싱
    st = 'a' if len(st) == 0 else st[:15]
    # ^ : [] 밖에 있으니 문자열의 맨 처음, $ : 문자열의 맨 뒤
    st = re.sub('^[.]|[.]$', '', st)
    # 길이가 2 초과면 그냥 냅두고 아니면 뒷자리를 (3-길이)만큼 더 붙이기
    st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
    return st

 

728x90
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크