[Programmers] 신규 아이디 추천 (Python)

Mino·2021년 10월 15일
0

Programmers

목록 보기
6/8
post-thumbnail

문제

https://programmers.co.kr/learn/courses/30/lessons/72410


접근 방식

문제에 나온 조건 그대로 구현



초기 코드

import re

def solution(new_id):
    # 1단계
    new_id = new_id.lower()
    # 2단계
    new_id = re.sub('[~!@#$%^&*()=+\[{\]}:?,<>/]', '', new_id)
    # 3단계
    new_id = re.sub('(([.])\\2{1,})', '.', new_id)
    # 4단계
    if new_id[0] == '.':
            new_id = new_id[1:]
    if new_id[-1] == '.':
            new_id = new_id[:-1]
    # 5단계
    if len(new_id) == 0:
        new_id = 'a'
    # 6단계
    if len(new_id) >= 16:
        new_id = new_id[:15]
    # 7단계
    while len(new_id) <= 2:
        new_id = new_id + new_id[-1]
    return new_id

4단계에서 범위 관련 오류가 발생함.
if문을 사용해서 길이가 1보다 클 때와 아닐 때로 나눠서 작성을 해봐도 계속 같은 오류가 발생
(이유가 뭔지는 모르겠음)
계속 고민하다 문득 strip() 함수를 떠올림
+) new_id 값을 보존하고 새로운 변수를 생성



제출 코드

import re

def solution(new_id):
	# 1단계
	result = new_id.lower()
	# 2단계
	result = re.sub('[~!@#$%^&*()=+\[{\]}:?,<>/]', '', result)
	# 3단계
	result = re.sub('(([.])\\2{1,})', '.', result)
	# 4단계
	result = result.strip('.')
	# 5단계
	if len(result) == 0:
		result = 'a'
	# 6단계
	result = result[:15].rstrip('.')
	# 7단계
	while len(result) <= 2:
		result = result + result[-1]
	return result

제출 코드에서 더 깔끔하게 정제할 수 있을 것 같아 코드를 다시 작성해봄.
특히 정규표현식 부분을 더 깔끔하게 수정하고 싶었음.



정제 코드

import re


def solution(new_id):
	# 1,2단계
	result = re.sub('[^\w._\-]', '', new_id.lower())
	# 3단계
	result = re.sub('\.\.+', '.', result)
	# 4단계
	result = result.strip('.')
	# 5단계
	if len(result) == 0: result = 'a'
	# 6단계
	result = result[:15].rstrip('.')
	# 7단계
	result += result[-1] * (3 - len(result))
	return result



느낀점

정규표현식을 공부해놓으면 다양한 문자열에 대한 조건을 깔끔한 코드로 작성할 수 있을 것 같다.
자주 사용되는 정규표현식은 외워놔도 좋을 것 같다.

profile
코린이

0개의 댓글