[프로그래머스 코테 연습] 신규 아이디 추천

Gorae·2021년 6월 10일
0

알고리즘

목록 보기
7/19
post-thumbnail

문제 요약

7단계의 순차적인 처리 과정을 통해 유저가 입력한 아이디가 규칙에 맞는 지 검사하고, 규칙에 맞지 않은 경우 새로운 아이디를 추천하라.
1. new_id의 모든 대문자를 소문자로 치환
2. new_id에서 알파벳 소문자, 숫자, ‘-’, ‘_’, ‘.’ 제외한 모든 문자 제거
3. new_id에서 ‘.’가 두 번 이상 연속된 부분을 하나의 ‘.’로 치환
4. new_id에서 ‘.’가 처음이나 끝에 위치하면 제거
5. new_id가 빈 문자열이면, new_id에 ‘a’ 대입
6. new_id 길이가 16 이상이면, new_id를 처음부터 15개 문자를 제외한 나머지 문자 모두 제거, 제거 후 ‘.’가 맨 끝에 위치하면 제거
7. new_id 길이가 2 이하면 new_id 마지막 문자를 new_id 길이가 3이 될 때까지 반복해서 끝에 붙임

풀이 순서

친절히 설명된 규칙처럼, 그대로 구현해내면 됨

1차 풀이

단계를 그대로 구현했으나, 시간 초과가 뜬다.

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

2차 풀이(정규식 활용)

import re

def solution(new_id):
    st = new_id
    # 1
    st = st.lower()
    # 2
    st = re.sub('[^a-z0-9\-_.]', '', st)
    # 3
    st = re.sub('\.+', '.', st)
    # 4
    st = re.sub('^[.]|[.]$', '', st)
    # 5 # 6
    st = 'a' if len(st) == 0 else st[:15]
    st = re.sub('^[.]|[.]$', '', st)
    # 7
    st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])

    return st

풀이에 사용된 정규식 파헤치기

  • 정규식이란?

    복잡한 문자열을 처리할 때 사용하는 기법으로, 메타 문자를 사용한다.

  • 메타 문자

    메타 문자란?

    • 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용하는 문자로, 다음과 같은 것이 있다.
      . ^ & * + ? {} [] / | ()

    문자 클래스 []

    • 문자 클래스로 만들어진 정규식은 [] 사이의 문자들과 매치라는 의미를 갖는다.
    • [] 안의 두 문자 사이에 하이픈(-)을 사용하면 두 문자 사이의 범위를 의미한다.
    • [] 안에는 어떤 문자나 메타 문자도 사용 가능하다.

    ^ $

    • ^ : 문자열 맨 앞부터 일치하는 경우를 검색
    • $ : 문자열 맨 뒤에서 일치하는 경우를 검색

    패턴 뒤의 + * ?

    • 위 문자들은 패턴 뒤에 위치하면, 해당 패턴이 반복적으로 존재하는지 검사한다.
      +: 1번 이상
      *: 0번 이상
      ?: 0번 혹은 1번 이상
  • re.sub

    • re.sub( pattern, sub_word, script )

      pattern: 찾고 싶은 것
      sub_word: 바꾸고 싶은 것(특정 문자열 또는 함수일 수 있음)
      script: 찾을 곳
    • sub 함수는 주어진 문자열에서 일치하는 모든 pattern을 replace하여 그 결과를 문자열로 반환함.

느낀점

  • 정규식 풀이하는 게 꼭 암호 해독하는 느낌이라 재밌었다. 잘 익혀서 활용하자.
  • 갈 길이 멀다!
profile
좋은 개발자, 좋은 사람

0개의 댓글