꼬꼬마 블로그

꼬꼬마의 기술 블로그

문제 설명

프로그래머스 레벨 1의 문제로 2021 KAKAO BLIND RECRUITMENT 문제입니다. 주로 문자열 처리를 이룹니다.

문제가 생각보다 길어보이지만 가장 중요한건 아래 부분입니다.

ID를 입력받아 해당 단계를 거친 후 문자열을 반환하는 문제입니다.

풀이

usable_char = ['-', '_', '.']


def delete_exclude_char(id: str):
    result = []
    for c in id:
        if c.isalpha() or c.isdigit():
            result.append(c)
        elif c in usable_char:
            result.append(c)

    return ''.join(result)


def merge_period(id: str):
    stack = []
    for i in range(len(id)):
        if len(stack) > 0 and stack[-1] == '.' and id[i] == '.':
            stack.pop()

        stack.append(id[i])

    if len(stack) > 0 and stack[0] == '.':
        del stack[0]

    if len(stack) > 0 and stack[-1] == '.':
        del stack[-1]

    return ''.join(stack)


def solution(new_id: str):
    # 1단계
    new_id = new_id.lower()

    # 2단계
    new_id = delete_exclude_char(new_id)

    # 3,4단계
    new_id = merge_period(new_id)

    # 5단계
    if len(new_id) <= 0:
        new_id = 'a'

    # 6단계
    if len(new_id) >= 16:
        new_id = new_id[0:15]

    if new_id[-1] == '.':
        new_id = new_id[:-1]

    # 7단계
    if len(new_id) <= 2:
        while len(new_id) <= 2:
            new_id = new_id + new_id[-1]

    return new_id

간단설명

각 단계별로 메소드 혹은 코드를 짜서 해결하였습니다. 각각의 단계를 설명하도록 하겠습니다.

 

1단계
new_id.lower() 메소드로 모든 알파벳을 소문자로 변경합니다.

 

2단계
delete_exclude_char()라는 함수를 만들어 사용했습니다.
각각의 문자가 알파벳, 숫자 혹은 사용가능한 문자가 아닐경우 해당 문자를 뺀 문자열을 만들어 반환합니다.

 

3, 4단계
merge_period()라는 함수를 만들어 사용했습니다.
연속한 마침표를 확인하기 위해 stack 자료구조를 이용했습니다. 만약 .이 연속될 경우 stack.pop() 후 넣어줍니다.

문자열의 가장 앞, 뒤에 마침표가 위치한다면 제거해줍니다.

 

5단계
만약 빈 문자열이라면 "a"를 대입합니다.

 

6단계
문자열의 길이가 16자 이상이라면 문자열 슬라이싱을 통해 문자열을 잘라줍니다.

 

7단계
문자열의 길이가 2자 이하라면 3자가 되도록 while문을 통해 마지막 문자를 붙여줍니다.