[Programmers] 신규 아이디 추천

eunseo kim 👩‍💻·2021년 6월 22일
1

🎯 programmers > 2021 KAKAO BLIND RECRUITMENT > 신규 아이디 추천


🤔 나의 풀이

📌 문제

- programmers > 2021 KAKAO BLIND RECRUITMENT > 신규 아이디 추천

📌 날짜

2021.06.23

📌 시도 횟수

1 try

💡 Code

def solution(new_id):
    answer = level7(level6(level5(level4(level3(level2(level1(new_id)))))))
    return answer


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


def level2(new_id):
    changed = ""
    for letter in new_id:
        if letter not in "~!@#$%^&*()=+[{]}:?,<>/":
            changed += letter
    return changed


def level3(new_id):
    idx, dots = 0, 0
    changed = ""
    while new_id and idx < len(new_id):
        if new_id[idx] == ".":
            dots += 1
            if idx == len(new_id) - 1:
                changed += new_id[idx]
        else:
            if dots >= 1:
                changed += "."
                dots = 0
            changed += new_id[idx]
        idx += 1

    return changed

    if idx >= 2:
        return "." + new_id[idx:]
    return new_id


def level4(new_id):
    if new_id:
        if new_id[0] == ".":
            new_id = new_id[1:]
    if new_id:
        if new_id[-1] == ".":
            new_id = new_id[:-1]

    return new_id


def level5(new_id):
    if not new_id:
        return "a"
    return new_id


def level6(new_id):
    if len(new_id) >= 15:
        new_id = new_id[:15]
    if new_id[-1] == ".":
        return new_id[:-1]
    return new_id


def level7(new_id):
    letter = new_id[-1]
    while len(new_id) < 3:
        new_id += letter
    return new_id

💡 문제 해결 방법

💡 새롭게 알게 된 점

- 너무 길고 복잡하다. 간략화 시킬 필요가 있다.

❌ (한번에 맞추지 못한 경우) 오답의 원인


📌 1차 개선

💡 문제 해결 방법

- Level3을 개선해보았다. 방법은 2가지를 사용했다.

- (1) while문을 통해 1번 반복할때마다 ".."를 "."로 치환한다.
따라서 모든 ".."가 사라질때까지 반복하면, 최종적으로 "."만 남게 된다.

- (2) for문을 통해 한 글자씩 새로운 문자열로 옮긴다.
단, 새롭게 옮긴 문자열의 맨 끝이 "."인 경우에
현재 문자를 검사했을때 똑같이 "."이라면 옮기지 않고 pass한다.

💡Code : 방법 1

# 방법 1 : ".." → "."를 반복하여 ".."를 없앰
def level3(new_id):
    while ".." in new_id:
        new_id = new_id.replace("..", ".")
    return new_id

💡Code : 방법 2

# 방법 2
def level3(new_id):
    changed = new_id[0]
    for letter in new_id[1:]:  # changed 문자열의 끝이 "."이면 "."  추가 X
        if changed[-1] == "." and letter == ".":
            pass
        else:
            changed += letter
    return changed

📌 2차 개선 : 정규식의 사용

💡 문제 해결 방법

- 정규식을 이용하면 정말 깔끔하게 풀 수 있다.
- re.sub('패턴', '바꿀문자열', '문자열', 바꿀횟수) => 이것도 기억하자.

💡Code

import re


def solution(new_id):
    answer = new_id
    # 1단계 : 모두 소문자로 치환
    answer = answer.lower()

    # 2단계 : 알파벳, 숫자, -, _, .를 제외한([^]) 모든 문제를 ""으로 치환
    answer = re.sub("[^a-z0-9\-\_\.]", "", answer)

    # 3단계 : 마침표가 1개 이상(+)이면 하나로 치환
    answer = re.sub("\.+", ".", answer)

    # 4단계 : 마침표가 처음(^)/끝($)이라면 제거
    answer = re.sub("^[.]|[.]$", "", answer)

    # 5단계 : 빈 문자열이면 "a"
    if not answer:
        answer = "a"

    # 6단계 : 16자 이상이면 앞의 15개만
    if len(answer) > 15:
        answer = answer[:15]
        if answer[-1] == ".":
            answer = answer[:-1]

    # 7단계 : 길이가 2자 이하면 맨 마지막 문자를 3이 될때까지 반복
    if len(answer) <= 2:
        answer += answer[-1] * (3 - len(answer))

    return answer

✨정규식 간단하게 정리하기

정규식 표현
\|또는
()그룹
[]괄호안의 어떤 문자든지
[^]괄호안의 어떤 문자가 아니다
(?:)찾지만 기억하지는 않음
?0 또는 1
*0개 이상
+1개 이상
{n}n번 반복
{min,}, {min,max}최소, 최소 ~ 최대
\b단어 경계
\B단어 경계가 아님
^문장의 시작
$문장의 끝
.어떤 글자 (줄바꿈 문자 제외)
\ddigit 숫자
\Ddigit 숫자 아님
\wword 문자
\Wword 문자 아님
\sspace 공백
\Sspace 공백 아님

출처 - 드림코딩 : 정규식 Youtube 강의

profile
열심히💨 (알고리즘 블로그)

0개의 댓글