일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 프로그래머스 파이썬
- 편스토랑 우승상품
- PYTHON
- programmers
- Git
- ChatGPT
- Real or Not? NLP with Disaster Tweets
- 코로나19
- 맥북
- gs25
- AI 경진대회
- SW Expert Academy
- Docker
- 백준
- hackerrank
- 더현대서울 맛집
- 편스토랑
- ubuntu
- Kaggle
- 금융문자분석경진대회
- dacon
- leetcode
- 캐치카페
- 우분투
- 프로그래머스
- 데이콘
- Baekjoon
- github
- 파이썬
- 자연어처리
- Today
- Total
솜씨좋은장씨
[Programmers] 2021 KAKAO BLIND RECRUITMENT신규 아이디 추천 (Python) 본문
[Programmers] 2021 KAKAO BLIND RECRUITMENT신규 아이디 추천 (Python)
솜씨좋은장씨 2021. 2. 11. 15:13
코딩 1일 1문제!
오늘의 문제는 프로그래머스의 2021 카카오 블라인드 채용 문제였던
신규 아이디 추천 입니다.
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 하면 끝!
정규식만 사용할 줄 안다면 비교적 쉽게 풀 수 있던 문제였던 것 같습니다.
제출 결과
읽어주셔서 감사합니다.
'Programming > 코딩 1일 1문제' 카테고리의 다른 글
[Programmers] 문자열 다루기 기본 (Python) (0) | 2021.02.13 |
---|---|
[Programmers] 2019 KAKAO BLIND RECRUITMENT 실패율 (Python) (0) | 2021.02.12 |
[HackerRank] Reverse a doubly linked list (Python) (0) | 2021.02.09 |
[HackerRank] Insert a node at a specific position in a linked list (Python) (0) | 2021.02.08 |
[Programmers] 가운데 글자 가져오기 (Python) (0) | 2021.02.07 |