Moe's Tech Blog

[알고리즘] 프로그래머스의 '신규 아이디 추천' 문제를 풀으며 본문

Algorithms/Journal

[알고리즘] 프로그래머스의 '신규 아이디 추천' 문제를 풀으며

moe12825 2022. 2. 28. 03:47
import re

def solution(new_id):
    def process_level_1(user_id):
        """
        new_id의 모든 대문자를 대응되는 소문자로 치환합니다
        """
        return user_id.lower()

    def process_level_2(user_id):
        """
        new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
        """
        return re.sub(r"[^a-z0-9\-\_\.]", "", user_id)

    def process_level_3(user_id):
        """
        new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
        """
        return re.sub(r"\.{2,}", ".", user_id)

    def process_level_4(user_id):
        """
        new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
        """
        if user_id == "":
            return user_id

        if user_id[0] == "." and user_id[-1] == ".":
            return user_id[1:-1]
        elif user_id[0] == ".":
            return user_id[1:]
        elif user_id[-1] == ".":
            return user_id[:-1]
        return user_id

    def process_level_5(user_id):
        """
        new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
        """
        return "a" if user_id == "" else user_id

    def process_level_6(user_id):
        """
        new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
        만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
        """
        user_id = user_id[:15] if len(user_id) > 15 else user_id
        return user_id[:-1] if user_id[-1] == "." else user_id

    def process_level_7(user_id):
        """
        new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
        """
        length_required = 3 - len(user_id)
        return user_id + (user_id[-1] * length_required) if length_required > 0 else user_id

    new_id = process_level_1(new_id)
    new_id = process_level_2(new_id)
    new_id = process_level_3(new_id)
    new_id = process_level_4(new_id)
    new_id = process_level_5(new_id)
    new_id = process_level_6(new_id)
    answer = process_level_7(new_id)
    return answer

나의 풀이

  • 필자는 가독성 중심으로 문제를 풀기 시작했었다.
    • 중간중간에 생각이 하얗게 되는 현상을 최소화 하고 싶었다.
  • 문제를 이해한다음 test case들을 edge case 부터 적었었다.
  • 하나하나 풀면서 전에 알지 못했던 test case를 추가로 add 했다.

  • 읽고 이해하기 쉽게 코드를 간결하게 썼다.

 

잘했던점

  • 각각의 step을 함수를 이용해 구현했다.
    • 읽기 편할뿐만 아니라 test cases를 만들때도 쉬웠었다.

  • TDD처럼 솔루션을 작성하기전에 test cases를 만들어 뿌듯하다.
    • 코드에 오타가 있었는데 각각 step마다 test case를 만든 덕분에 "고쳤는데 다른것도 고장나지 않았겠지?" panic하지 않고 보다 안정적으로 마칠 수 있었다.

아쉬웠던점

  •  Test cases 작성하는데 능숙하지 않아서 그런지 miss한 test case들이 많이 있었다.
  •  풀면서 깨달았지만 각각의 step마다 test case를 구성했으면 보다 편이 풀 수 있었지 않았을까 필자는 생각한다.
  •  푸는데 시간이 아직 오래 걸린다.
    •  계속 연습하면은 시간이 단축될거라고 필자는 믿는다.

배운점들

  • Test case를 처음에 풀기 전에 적으면 “내가 이 문제를 이해 했는가”의 답에 도움이 된다.
  • 함수는 사용하면 가독성을 많이 높여준다.