# 아이디의 길이는 3자 이상 15자 이하여야 합니다.
# 아이디는 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 문자만 사용할 수 있습니다.
# 단, 마침표(.)는 처음과 끝에 사용할 수 없으며 또한 연속으로 사용할 수 없습니다.

# 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
# 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
# 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
# 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.

# 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
# 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
#     만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
# 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.


def solution(new_id):

    # 1단계 소문자 치환
    answer = new_id.lower()

    # 2단계 소문자 숫자 빼기 밑줄 마침표만 남기기
    char2 = 'abcdefghijklmnopqrstuvwxyz0123456789-_.'

    for i in answer:
        if (char2.find(i) < 0):
            answer = answer.replace(i,"")

    # 3단계 .. 두개를 . 하나로 치환
    i = 1
    ii=answer.count("..")
    while i < ii:
        ii=answer.count("..")
        answer = answer.replace("..", ".")

    # 4단계 양끝 . 제거
    answer = answer.strip(".")

    # 5단계 빈문자열일때 a 추가
    if (answer == ""): answer = "a"

    # 6단계 16자 이상 자르기
    answer = answer[0:15]
    # + 양끝제거 한번 더
    answer = answer.strip(".")

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

    return answer

개발스토리

각 단계별로 나누지말고 한번에 하는 방법이 없을까 고민하다가 이런저런 시도는해보았지만 실패했다. 처음 코드를 다만들고나니 테스트 검증에 실패가 자꾸 나왔다. 원인을 분석하니 3단계에서 오류가 나왔다.

  점이 4개 있다고 가정했을때 한번 리플레이스를 거치면 두개를 하나로 만들면서 다시 두개가 된다. 이부분에서 문제가 되었다. 문자열의 ..을 세서 없을때까지 리플레이스를 진행하는 방식으로 변경했다. 여러 테스트를 진행하면서 비주얼 스튜디오 코드에서 지원하는 python preview 에서는 1000 스텝을 넘어서면 계산을 중단해버렸다. 처음에는 파이썬자체에서 1000스텝까지만 지원하는줄 알고 스텝을 줄이기 위해서 코드를 자꾸만 수정했었다. 스텝상관없이 지원되는 것을 나중에서야 알게 되었지만 스텝을 줄인다는 것이 시간 단축에 효과를 보이는거 같아서 좋은 경험을 했다.

+ Recent posts