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

이숭인·2021년 6월 26일
0

알고리즘 문제풀이

목록 보기
7/17

신규 아이디 추천 바로가기

문제풀이:

  1. 문제에서 주어진 단계별로 수행하면 됨.
    • 1단계 -> lower()를 이용해서 대문자 -> 소문자로 치환
    • 2단계 -> 조건식 사용 혹은 정규표현식을 이용해 원하는 문자를 제외한 나머지 문자를 제거
    • 3단계 -> 여러가지 방법이 있겠지만 replace를 이용해 치환함
    • 4단계 -> 앞 뒤가 "."인지 확인하고 맞다면 제거
    • 5단계 -> 문자열 길이 확인 후 길이가 0 이라면 "a"를 return 0이 아니라면 그대로 둠
    • 6,7단계 -> 문자열 길이 체크 후 주어진 조건대로 수행

핵심:

  1. 주어진 조건대로 원하는 문자를 제외한 나머지 문자를 제외시키면 됨
  2. 주어진 조건이 좀 많아서 메인 solution func에 넣으면 좀 복잡해질 수 있으니 .. 각 단계별로 함수화해서 쓰는게 헷갈리지 않고 문제를 풀 수 있음
  3. 인덱스 슬라이싱 혹은 정규표현식을 이용하여 문자열 다루면 됨

코드:

def solution(new_id):
    new_id = first(new_id)
    new_id = second(new_id)
    new_id = third(new_id)
    new_id = fourth(new_id)
    new_id = fifth(new_id)
    new_id = sixth(new_id)
    new_id = seventh(new_id)
    return new_id

def first(new_id):
    return new_id.lower()

def second(new_id):
    for ele in new_id:
        if ele.isalnum() or ele == "-" or ele == "_" or ele == ".":
            continue
        else:
            new_id = new_id.replace(ele,"")
    return new_id

def third(new_id):
    while ".." in new_id:
        new_id = new_id.replace("..",".")
    return new_id

def fourth(new_id):
    if new_id[0] == ".":
        new_id = new_id[1:]
    elif new_id[-1] == ".":
        new_id = new_id[:-1]
    return new_id

def fifth(new_id):
    if len(new_id) == 0:
        return "a"
    else:
        return new_id

def sixth(new_id):
    if len(new_id) >= 16:
        new_id = new_id[:15]
        print(new_id)
    return new_id[:-1] if new_id[-1] == "." else new_id

def seventh(new_id):
    if len(new_id) <= 2:
        while len(new_id) < 3:
            new_id += new_id[-1]
    return new_id

다른 사람의 풀이:

  • 정규표현식 라이브러리인 re을 이용
  • re.sub을 이용하여 문자열을 치환하는 방식으로 문제를 해결함

문제풀이:

  • 2단계 : 정규표현식 표현.. [^a-z0-9\-_.] 의 의미는 알파벳 소문자, 숫자, "-","_","."이 아닌 문자는 ""으로 치환하여 반환한다는 의미 (일부 문자들은 의미를 가지고 있어 그대로 사용하지 못하고 \을 이용하여 정해진 의미대로 사용하지 않고 문자 그대로를 이용한다.
    예: \-)
  • 3단계 : "\.+" 는 .문자가 1개 이상 연속되는 경우 '.'으로 치환하겠다는 의미
  • 4단계 : ^ 는 문자열의 시작을 의미하고 $ 는 문자열의 마지막을 의미한다. 따라서 ^[.]|[.]$ 는 문자열의 시작이나 끝이 "." 인 문자열이라면 "." 을 "" 으로 치환

다음 단계들은 문제에서 주어진대로 풀어나가면 된다.

코드:

import re

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

0개의 댓글