알고리즘
신규 아이디 추천(2021 카카오 블라인드)
eunyoung23
2022. 1. 16. 18:43
구현코드
import re
def solution(new_id):
# case1
new_id = new_id.lower()
# case2
p = re.compile('[a-z0-9-._]+')
result = p.findall(new_id)
new_id = "".join(result)
# case3
while ".." in new_id:
new_id = new_id.replace('..','.')
# case4
new_id = new_id.strip('.')
# case5
if new_id == "":
new_id = "a"
# case6
if len(new_id)>=16:
new_id = new_id[:15]
new_id = new_id.rstrip('.')
# case7
if len(new_id)<=2:
while len(new_id) < 3:
new_id += new_id[len(new_id)-1:]
answer = new_id
return answer
문제 해결 과정
[추가로 정리]
규칙1) 모든 대문자에 대응하는 소문자를 치환함
문자열.upper() : 모든 알파벳을 대문자로 변환
문자열.lower() : 모든 알파벳을 소문자로 변환
규칙2) 알파벳 소문자, 숫자, 빼기, 밑줄, 마침표를 제외한 모든 문자를 제거함
import re
new_id = input()
id2 = re.compile('[0-9a-z_.\-]+')
new_id = id2.findall(new_id) # 0-9, a-z, _,.,\,-가 들어간 부분만 리스트의 원소로 만듦
new_id = ''.join(new_id)
# 또는
#sub() 메서드 : 문자열 바꾸기
answer = re.sub('[^0-9a-z_.\-]+','',new_id.lower())
규칙3) 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환함
# 1번째 방법
while '..' in new_id:
new_id = new_id.replace('..','.')
# 2번째 방법
answer = re.sub('\.\.+','.',answer)
규칙4) 마침표(.)가 처음이나 끝에 위치한다면 제거함
strip() : 문자열에서 특정 문자를 제거할 수 있음(인자는 문자나 none이어야 함)
strip(인자) : 인자로 전달된 문자를 string의 오른쪽과 왼쪽에서 제거함
lstrip(인자) : 인자로 전달된 문자를 string의 왼쪽에서 제거함
rstrip(인자) : 인자로 전달된 문자를 string의 오른쪽에서 제거함
규칙5) 빈 문자열이라면, "a"를 대입함
if new_id == "":
new_id = 'a'
#or
ir new_id == '':
new_id+= 'a'
규칙6) 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
if len(new_id)>=16:
new_id = new_id[:15]
new_id = new_id.rstrip('.')
#or
new_id = new_id[:15].rstrip('.')
규칙7) 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
if len(new_id)<=2:
add = new_id[len(new_id)-1:]
while len(new_id)<3:
new_id+=add
# or
answer+=answer[-1]*(3-len(answer))