문제 리뷰

  1. 2021 카카오 블라인드 채용 1차 코딩테스트에서 1번 문제로 나온 문제로 이전에 풀었을 때는 단순하게 문제에서 요구하는 것을 하나씩 구현했습니다.
  2. 이번 부스트캠프를 진행하면서 정규식 관련 수업이 있었습니다. 수업 내용을 조원들과 리뷰하던 중에 팀원분께서 말씀해주셨는데 해당 문제를 정규식으로 해결하면 쉽고 빠르게 풀 수 있다고 해서 공부한 것을 복습하는 겸해서 풀기고 했습니다.
  3. 1차적으로 정규식으로 풀면서 어떻게 해야할 지 몰라서 for문과 if문으로 푼 것도 있었습니다..
  4. 다른 분들의 정답을 보고 어떻게 해서 나왔는지 정리해서 풀었습니다. ^과 $로 시작과 끝의 .를 제거한 것과 \.+를 활용해서 반복되는 패턴을 잡는 방식도 있다는 것을 알게 됐습니다.

문제 링크

 

2021 카카오 신입공채 1차 온라인 코딩 테스트 for Tech developers 문제해설

지난 2020년 9월 12일 토요일 오후 2시부터 7시까지 5시간 동안 2021 카카오 신입 개발자 공채 1차 코딩 테스트가 진행되었습니다. 테스트에는 총 7개의 문제가 출제되었으며, 개발 언어는 C++, Java, Jav

tech.kakao.com

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 카카오계정개발팀에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. 네오에게 주어진 첫 업무는 새로 가

programmers.co.kr

참고사이트

 

 

[이론 및 파이썬] 정규 표현식

정규 표현식이란? 정규 표현식, regexp 또는 regex라고 불리는 정규표현식(regular expression)은 일정한 규칙(패턴)을 가진 문자열을 표현하는 방법입니다. 복잡한 문자열 속에서 특정한 규칙으로 된 문

hwanii-with.tistory.com

 


1차적으로 푼 것으로 if와 for문으로 찾은 경우도 있습니다.

import re

def solution(new_id):
    change_id = new_id
    # 1 단계
    change_id = change_id.lower()
    # 2 단계
    change_id = re.findall(r'[a-zA-Z0-9\-_.]',change_id)
    next_id = ""
    for i in change_id:
        next_id += i
    change_id = next_id
    # 3 단계
    change_id = re.sub(r"\.+",'.',change_id)
    # 4 단계
    if change_id:
        if change_id[0] == '.':
            change_id = change_id[1:]
    if change_id:
        if change_id[-1] == '.':
            change_id = change_id[:-1]
    # 5 단계
    if change_id == '':
        change_id = 'a'
    # 6 단계
    if len(change_id) >= 16:
        change_id = change_id[:15]
        if change_id[-1] == '.':
            change_id = change_id[:-1]
    if len(change_id) < 3:
        while len(change_id) < 3:
            change_id += change_id[-1]
    return change_id

2차적으로 푼 것으로 모든 단계를 정규식으로 해결했습니다.

def solution(new_id):
    st = new_id
    # 1단계
    # lower로 대문자 -> 소문자
    st = st.lower()

    # 2단계
    # ^은 not을 의미, [a-z, 0-9, -, _, .] 을 제외한 나머지 ''로 바꾸기
    st = re.sub('[^a-z0-9\-_.]', '', st)

    # 3단계
    # .이 1번 이상 반복되는 모든 글자를 '.'로 바꾸기
    # 여기서 \.+ 에서 \는 욕심없는 반복으로 변형, .이 있는 글자만 포함
    st = re.sub('\.+', '.', st)
    # \를 제외하면 .뒤의 모든 글자를 1개로 처리함.
    # st = re.sub('.+', '.', st)
    # +는 {1,}로 바꿀 수 있음. .{1,}는 .이 1번이상 반복되는 글자를 그룹화하는 것을 의미함.
    # st = re.sub('\.{1,}','.',st)

    # 4단계
    # ^[.]은 문자열 시작이 .로 시작하는 것을 의미
    # |은 or을 의미
    # [.]$sms 문자열 끝이 .로 끝나는 것을 의미
    st = re.sub('^[.]|[.]$', '', st)

    # 5단계, 6단계
    # 만약 0글자이면 'a'
    # 아니면 15까지, st가 15보다 작다면 끝까지 포함하기 때문에 :15까지 슬라이싱해도 끝까지 하는 것과 같음.
    st = 'a' if len(st) == 0 else st[:15]

    # 4단계 반복
    st = re.sub('^[.]|[.]$', '', st)

    # 7단계
    # 길이가 3보다 작다면 마지막 글자( == [-1])를 3 - len(st)만큼 반복해서 st에 붙임.
    st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
    return st

+ Recent posts