[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개의 댓글

관련 채용 정보