[Programmers - 2021 KAKAO BLIND RECRUITMENT #1] 신규 아이디 추천

OneUne·2021년 7월 10일
0

Algorithms

목록 보기
4/4

2021년을 시작하며 야심차게 시작하려고 했던 VELOG는-,,!
하반기부터 시작하는 걸로 하기로 했다! ㅎㅎ (아무튼 그럼)

문서화를 좋아하는 편인데, 주로 내가 보기 편한 형태로 워드로 작성해 왔다.
다시 VELOG를 찾은 이유는, 앞으로는 공개적인 곳에 지식 공유를 위한 목적으로 문서화를 해보기로 했기 때문!

첫 번째 포스트는 2021 카카오 신입공채 1차 온라인 코딩 테스트 문제 풀이!
해당 문제들은 Kakao Tech 블로그와 프로그래머스에 올라와 있다.
링크 👉 2021 카카오 신입공채 1차 온라인 코딩 테스트 for Tech developers 문제해설

문제 풀이 아이디어


첫 번째 문제인 신규 아이디 추천 은 딱 보자마자 "정규식"으로 풀어야 한다고 생각했다. 특히, 2-3단계를 풀이하는 과정에서.

파이썬 정규식 관련 문서는 점프 투 파이썬 07-2 정규 표현식 시작하기 보면 잘 정리되어 있다.

아이디어 구체화

라고 쓰고 삽질기라고 읽는다.

해당 문제에서

new_id에 나타날 수 있는 특수문자는 -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.

라고 명시하기는 했으나, 저걸 하나하나 다 입력해서 제외하는 것보다 2단계에서 언급한 것처럼 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외하고 싶었다.

정규식에서 무언가를 제외하려면 문자 클래스 안에서 ^을 사용해야 하는데, 문제는 or가 있고 and가 없다는 것이었다.

p = re.compile('[\W|^\-|^\.]')

위 말 그대로 알파벳 소문자(_이 포함됨) 가 아닌 것이거나, 빼기가 아닌 것이거나, 마침표가 아닌 것이거나를 정규식으로 표현했더니..

>>> p.findall("...!@BaT#*..y.abcdefghijklm")
['.', '.', '.', '!', '@', '#', '*', '.', '.', '.']

or라서.. 엉엉.. 아래와 같이도 컴파일 해봤다.

p = re.compile('[^\w|^\-|^\.]') 
>>> p.findall("...!@BaT#*..y.abcdefghijklm")
['!', '@', '#', '*']

전자는 .을 못 거르고,, ^는 거르고.. 후자는 .을 거르고 ^는 못 거르고.. ~

또 정규식을 사용하면서 조금 헤맨 부분들이 있다면

  • .을 쓰려면 [.] 을 써야 한다고 생각해서 문자 클래스 안에서도 [.] 써야 되는 건 줄 알고 [^.] 막 이랬는데 그냥 [^.] 이었다.
  • 하이픈도 문자클래스 안에서는 ~ 의 개념(from-to)이 있기 때문에 하이픈 빼고 나머지가 어려웠으나 얘도 그냥 escape sequence 사용했으면 되는 거였다.

결국 하나하나 다 빼주기로 했다 ㅎㅎ..! 주어진 특수문자 중 escape sequence 가 필요한 문자는 의외로 ^와 ] 뿐이었다.

작성 코드

import re
def solution(new_id):
    #1단계
    answer = new_id.lower()
    #2단계
    p = re.compile('[~|!|@|#|$|%|\^|&|*|(|)|=|+|[|{|\]|}|:|?|,|<|>|/]')
    answer = p.sub('', answer)
    #3단계
    p = re.compile('[.]{2,}')
    answer = p.sub('.', answer)
    #4단계
    p = re.compile('^[.]|[.]$')
    answer = p.sub('', answer)
    #5단계
    if answer == '' : answer ="a"
    #6단계
    answer = answer[:15]
    answer = p.sub('', answer)
    #7단계
    if len(answer) < 3:
        while(len(answer)<3): answer+=answer[-1]
    return answer

위와 같이 코드를 작성했으나 re에 대한 docs를 읽어 보니,
p = ~ 하고 p.sub 가 아니라 re.sub(pattern, repl, string, count=0, flags=0) 이렇게도 쓸 수 있었다.

결론/느낀점

  1. 실제로 내가 코딩 테스트에 응시하고 있었다면, 어차피 정확성만 따지는 몸풀기 1번 문제는 그냥 최대한 빨리 푸는 게 낫지 않을까! ㅎ_ㅎ
  2. 문제를 풀고 나서 다른 사람들의 풀이를 보았다.
    헤맸던,, 2단계 정규식 부분을 이렇게 쓰면 되는 거였다,,
re.sub('[^a-z0-9\-_.]', '', st)

아아,, 처음에 findall이 아니라 match로 정규식을 확인했던 게 문제였다.. or가 어쩌고.. and가 어쩌고.. 나.. 멍청이..!

profile
그러니까 이제 장차 멋쟁이 토마토가 될

0개의 댓글