[프로그래머스] 신규 아이디 추천

hyun·2022년 5월 13일
0

알고리즘 문제

목록 보기
6/10
post-thumbnail

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

이 포스트에서 다룰 것

이 문제는 문자열을 다루는 문제로, 오래 전에 이미 풀었었다. 그런데 얼마 전 포스팅한 정규식을 이용하면 더 간단하게 풀 수 있을 듯 하여 다시 풀어보고, 이전의 풀이와 비교해보았다. 문제를 풀면서 파이썬에서의 정규식 사용법 또한 알아볼 것이다.

문제 이해

주어진 문자열을 아래의 조건에 따라 필터링해서 리턴하는 문제이다.

이 문제는 알고리즘 지식을 필요로 하기보다는 시키는 대로 하면 풀리는 문제이다. 특정 문자를 제거하거나 치환하는 조건들이 많아 정규식을 이용하면 좋을 것 같다. 문제를 풀기 전에, 파이썬에서는 정규식을 어떻게 사용하는지 알아본 후 그를 이용해 문제를 풀이할 것이다.

파이썬에서의 정규식 사용

파이썬은 정규 표현식을 사용할 수 있는 re(regular expression) 모듈을 제공한다. re 모듈은 파이썬에 내장된 기본 라이브러리이다. 문제에서 필요한 치환 기능을 사용하려면, re.sub메소드를 사용하면 된다. 사용법은 re.sub(pattern, new_text, text) 으로, text중에서 pattern에 맞는 부분을 new_text로 대체한다.

import re
text = "I am student"
new_text = re.sub('\w', "*", text)

print('new text:', new_text)

text에 있는 모든 문자를 *로 치환하는 코드로, 결과는 다음과 같이 잘 동작한다.

그러면 예전에 풀었던 코드와, 이 re.sub를 사용한 풀이를 비교해보자.

기존 코드

def solution(new_id):
    answer = ''
    # 1단계: 소문자로 변환
    new_id = new_id.lower()

    # 2단계: 소문자, 숫자, -, _, . 제외한 모든 문자 제거 
    for word in new_id:
        if word.isalnum() or word in '-_.':
            answer += word

    # 3단계 : 마침표 2번 이상 > 하나로
    while '..' in answer:
        answer = answer.replace('..','.')

    # 4단계 : 양 끝 마침표 제거
    answer = answer[1:] if answer[0] == '.' and len(answer) > 1 else answer
    answer = answer[:-1] if answer[-1] == '.' else answer

    # 5단계 : 빈 문자열이면 a 대입
    answer = 'a' if answer == '' else answer

    # 6단계 : 길이가 16자 이상이면 1~15자만 남기기 & 맨 끝 마침표 제거
    if len(answer) >= 16:
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:-1]

    # 7단계 : 길이가 3이 될 때까지 반복해서 끝에 붙이기
    if len(answer)<=3:
        answer = answer + answer[-1] * (3-len(answer))
    return answer

정규식 이용 풀이

import re

def solution(new_id):
    answer = ''
    # 1단계: 소문자로 변환
    answer = new_id.lower()
    
    # 2단계: 소문자, 숫자, -, _, . 제외한 모든 문자 제거 
    answer = re.sub('[^a-z\d\-\_\.]', '', answer)
    
    # 3단계 : 마침표 2번 이상 > 하나로
    answer = re.sub('\.\.+', '.', answer)
    
    # 4단계 : 양 끝 마침표 제거
    answer = re.sub('^\.|\.$', '', answer)
    
    # 5단계 : 빈 문자열이면 a 대입
    if answer == '':
        answer = 'a'
    
    # 6단계 : 길이가 16자 이상이면 1~15자만 남기기 & 맨 끝 마침표 제거
    answer = re.sub('\.$', '', answer[0:15])
    
    # 7단계 : 길이가 3이 될 때까지 반복해서 끝에 붙이기
    while len(answer) < 3:
        answer += answer[-1:]
    return answer
profile
프론트엔드를 공부하고 있습니다.

0개의 댓글