[Python] Programmers 코딩테스트 연습 - '신규 아이디 추천'

히태하태·2021년 9월 4일
0

Coding Test

목록 보기
2/3
post-thumbnail

* 서론

프로그래머스에서 카카오 코딩테스트 중 '신규 아이디 추천' 문제를 풀며 문자열을 효과적으로 처리할 필요가 있었다.
가장 처음 고민한 것은, '정규 표현식을 사용하여 powerful한 문자열 처리를 하자' 였다.
Python 공식 reference를 찾아서 공부 하면서 풀어보았다.

* 내용

정규 표현식. RE (Regular Expressions)
문자열 처리시, 특정한 패턴에 해당하는 문자열을 찾아 보다 효율적으로 문자열을 다룰 수 있는 기능

내 풀이는 아래와 같다. 효율성검사도 통과하였다. 하지만 정규표현식만으로는 풀지 못하였다. 문자열 내장함수를 사용하였는데, 짧은 문자열의 경우 시간적으로 더 효율이 좋다한다.

import re
def solution(new_id):
    answer = ''
    
    #1.대문자->소문자 전환
    answer = new_id.lower()
    print(answer)
    
    #2.알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거
    pattern = '[^a-z0-9\-\_\.]'
    answer = re.sub(pattern, '',answer)
    print(answer)
    
    #3.마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
    pattern = '\.+'
    #p = re.compile(pattern)
    #answer = p.sub('.', answer)
    answer = re.sub(pattern, '.', answer)
    print(answer)
    
    #4.마침표(.)가 처음이나 끝에 위치한다면 제거
    if answer.startswith('.') : answer = answer[1:]
    if answer.endswith('.') : answer = answer[:-1]
    
    #5.빈 문자열이라면, "a"를 대입
    if not answer:
          answer = 'a'
          
    #6.길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거
    #만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
    answer = answer[0:15]
    if answer.endswith('.') : answer = answer[:-1]
    
    #7.길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙임
    if len(answer) <= 2 :
      answer = answer.ljust(3, answer[-1:])
    return answer
    
#실행 코드
id = '...!@B...aT#*..y.abcdefghijklm.'
print(solution(id))

아래는 다른 사람 풀이이다. 정말 Simple 하다... 정규표현식과 더불어 삼항연산자(Ternary Operators)까지 이용하였다.
내가 놓친 부분을 확인해보도록 하자.

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

문자열의 처음과 마지막을 찾을때, 정규표현식 중 메타문자를 사용하여 ^ , $ 를 사용하였다.

그리고 가장 마지막 조건에서 다른 분 풀이를 보니 마지막 글자를 모자라는 갯수만큼 list로 만들어서 join 하였다.
나는 ljust 함수를 사용하여, 길이를 맞추고 마지막글자로 채워 넣었다.
실행 시간을 비교해보니 재밌는 결과가 나왔다. (2자리이하 조건은 동일하고, 총 문자열 길이를 늘려가며 채워야하는 값을 늘렸다.)
내 풀이가 미세하게 빨랐다. 모자라는 길이 만큼 채워야하는 자릿수가 커질수록 그 차이는 심했다.

몇번 실행해본 어림잡은 값이다.

문자열 총 길이ljust 함수join 을 이용
30:00:00.0000030:00:00.000014
1000:00:00.0000040:00:00.000049
10000:00:00.0000050:00:00.000287
100000:00:00.0000060:00:00.001718

* 결론

정규표현식은 복잡한 문자열을 처리하기에 유용하지만, 문자열 길이가 짧은 경우 문자열 내장함수를 쓰는것이 빠르다.
그리고, 문자열을 특정 길이만큼 채울때는 ljust, rjust 함수를 이용하자.

profile
시작이 반이다. 일단 시작해보자.

0개의 댓글