알고리즘

신규 아이디 추천(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))