관리 메뉴

솜씨좋은장씨

[Programmers] 2021 KAKAO BLIND RECRUITMENT신규 아이디 추천 (Python) 본문

Programming/코딩 1일 1문제

[Programmers] 2021 KAKAO BLIND RECRUITMENT신규 아이디 추천 (Python)

솜씨좋은장씨 2021. 2. 11. 15:13
728x90
반응형

코딩 1일 1문제!

오늘의 문제는 프로그래머스의 2021 카카오 블라인드 채용 문제였던

신규 아이디 추천 입니다.

 

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

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

programmers.co.kr

Solution

import re

def solution(new_id):
    answer = ''
    
    answer = new_id.lower()
    
    answer = re.sub('[^a-z0-9\-\_\.]', '', answer)
    
    answer = re.sub('\.{2,}', '.', answer)
    
    answer = re.sub('^\.|\.$', '', answer)
    
    answer = 'a' if answer == '' else answer
    
    answer = answer[:15] if len(answer) > 15 else answer
        
    
    answer = re.sub('\.$', '', answer)
    
    while True:
        if len(answer) > 2:
            break
        answer = answer + answer [-1]
    
    return answer

Solution 풀이

이 문제는 문제에서 알려준 7가지의 단계를 차례대로 코드로 구현하기만 하면 되는 문제였습니다.

7가지의 단계는 위와 같습니다.

 

먼저

1단계 - 모든 대문자를 소문자로 치환하기

lower() 를 활용하여 모든 문자를 소문자로 치환해줍니다.

answer = new_id.lower()

2단계 - 알파벳, 소문자, 숫자, -, _ , . , 을 제외한 모든 문자를 제거하기

여기서는 python의 re( 정규식 )를 활용하였습니다.

answer = re.sub('[^a-z0-9\-\_\.]', '', answer)

re.sub를 활용하였으며 

알파벳은 a-z, 숫자는 0-9, -, _ , . 은 특수문자 이므로 \를 붙여 패턴을 만들고

제거하는 것이 아닌 남겨야하므로 맨 앞에 ^ 를 붙였습니다.

 

3단계 - 마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환하기

answer = re.sub('\.{2,}', '.', answer)

마침표가 2번 이상 연속된 부분을 하나의 마침표로 치환하기 위해서

{n, m} -n번 이상 m번 이하 반복 옵션을 활용했습니다.

이 문제에서는 2번 이상이므로 { 2, }으로 m의 부분을 비워 두어 2번 이상 옵션을 만들었습니다.

 

4단계 - 처음이나 끝에 마침표가 존재하면 제거하기

처음과 끝에 존재하는 마침표를 제거하기 위해서

시작을 나타내는 ^ 와 마지막을 나타내는 $ 을 활용했습니다.

처음과(or) 마지막을 동시에 표현하기 위해 or를 나타내는 | 를 활용했습니다.

answer = re.sub('^\.|\.$', '', answer)

 

5단계 - 4단계 까지 거친 결과가 '' ( 빈 문자열 ) 일 경우 'a' 넣어주기

answer = 'a' if answer == '' else answer

6단계 - 5단계 까지 거친 결과의 길이가 16이상일 경우 처음부터 15까지 길이의 문자열만 남기고 남긴 뒤에 . 가 끝에 존재한다면 끝에 존재하는 . 를 제거하기

answer = answer[:15] if len(answer) > 15 else answer
answer = re.sub('\.$', '', answer)

7단계 - 만약 6단계 까지 거친 문자열의 길이가 2 이하라면 길이가 3이 될때까지 마지막 문자를 더해주기

while True:
    if len(answer) > 2:
        break
    answer = answer + answer [-1]

 

여기까지 해주고 모든 단계를 마친 정답을 return 하면 끝!

 

정규식만 사용할 줄 안다면 비교적 쉽게 풀 수 있던 문제였던 것 같습니다.

 

제출 결과

읽어주셔서 감사합니다.

Comments