[그 외]/ㄴ (코테연습 : 파이썬 ver)
[프로그래머스] 신규 아이디 추천 (파이썬)
__hyeon2__
2021. 6. 25. 15:18
728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/72410
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
<나의 풀이>
def solution(new_id):
answer = []
# 2단계를 위해 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 추가한 리스트 생성
check = [str(i) for i in range(0, 10)] + [chr(i)
for i in range(97, 123)] + ['-', '_', '.']
# 1 : 모든 대문자를 대응되는 소문자로 치환
new_id = list(new_id.lower())
# 2 : 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)이면 추가
for i in new_id:
if i in check:
answer.append(i)
# 3 : 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
# 연속으로 나왔을 경우 앞에 있는 마침표를 공백으로 바꿔준 후 제거함
for i in range(len(answer)-1):
if (answer[i] == '.') and (answer[i+1] == '.'):
answer[i] = ' '
answer = "".join(answer).replace(' ', '')
# 4 : 마침표(.)가 처음이나 끝에 위치하면 슬라이싱을 이용해 제거
if (len(answer) >= 1):
if (answer[0] == '.'):
answer = answer[1:]
if (len(answer) >= 1):
if (answer[-1] == '.'):
answer = answer[:-1]
# 5 : 빈 문자열이라면, new_id에 "a"를 대입
if len(answer) < 1:
answer += 'a'
# 6 : 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거
if len(answer) >= 16:
answer = answer[:15]
# 7 : 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙임
elif len(answer) <= 2:
while(len(answer) < 3):
answer += answer[-1]
# 단계를 마친 후에 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
if (answer[-1] == '.'):
answer = answer[:-1]
return answer
3단계에서 애먹은 문제ㅠㅠㅠ
다른 사람의 풀이를 보니 생각보다 단순해서 또 한번 깨달음을 얻었다!
<다른 사람의 풀이>
def solution(new_id):
answer = ''
# 1
new_id = new_id.lower()
# 2
for c in new_id:
if c.isalpha() or c.isdigit() or c in ['-', '_', '.']:
answer += c
# 3
while '..' in answer:
answer = answer.replace('..', '.')
# 4
if answer[0] == '.':
answer = answer[1:] if len(answer) > 1 else '.'
if answer[-1] == '.':
answer = answer[:-1]
# 5
if answer == '':
answer = 'a'
# 6
if len(answer) > 15:
answer = answer[:15]
if answer[-1] == '.':
answer = answer[:-1]
# 7
while len(answer) < 3:
answer += answer[-1]
return answer
# <배운점>
# => 3단계 부분에서 '..'으로 연속된 마침표의 점을 찾는 점
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
# <배운점>
# => 역시 정규표현식이 최고라는 점... 코드도 간결하고 시간도 훨씬 절약할 수 있더라ㅠㅠㅠ
728x90
반응형