[Algorithm] [programmers] 신규 아이디 추천

1. 입력받은 문자열에서 대문자 찾아 소문자로 변경
2. 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 를 제외한 모든 문자 제거
3. 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
4. 마침표(.)가 처음이나 끝에 위치한다면 제거
5. 빈 문자열이라면 'a' 대입
6. 길이가 16자 이상이면, 문자열의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거
   만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
7. 길이가 2자 이하라면, 문자열의 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙임

<내 코드>

def solution(new_id):

    # 1
    answer1 = ''
    for i in range(len(new_id)):
        if 65 <= ord(new_id[i]) <= 90:  # 만약 아스키코드로 변환했을 때 대문자 범위에 있다면
            answer1 += chr(ord(new_id[i]) + 32)
        else:
            answer1 += new_id[i]
    # print('1', answer1)

    # 2
    answer2 = ''
    for i in range(len(answer1)):
        if 97 <= ord(answer1[i]) <= 122:  # 소문자라면
            answer2 += answer1[i]
        elif answer1[i].isdecimal():  # 숫자라면
            answer2 += answer1[i]
        elif answer1[i] == '-' or answer1[i] == '_' or answer1[i] == '.':
            answer2 += answer1[i]
        else:
            continue
    # print('2', answer2)

    # 3
    answer3 = ''
    while '..' in answer2:
        answer2 = answer2.replace('..', '.')
    answer3 += answer2
    # print('3', answer3)


    # 4
    answer4 = ''
    if answer3[0] == '.' and answer3[-1] == '.':
        answer4 += answer3.strip('.')
    elif answer3[0] == '.':
        answer4 += answer3.lstrip('.')
    elif answer3[-1] == '.':
        answer4 += answer3.rstrip('.')
    else:
        answer4 = answer3
    # print('4', answer4)

    # 5
    answer5 = ''
    if len(answer4) == 0:
        answer5 += 'a'
    else:
        answer5 += answer4
    # print('5', answer5)

    # 6
    answer6 = ''
    if len(answer5) >= 16:
        answer6 += answer5[:15]
        if answer6[-1] == '.':
            answer6 = answer6.rstrip('.')
    else:
        answer6 += answer5
    # print('6', answer6)

    # 7
    answer7 = ''
    if len(answer6) <= 2:
        answer7 += answer6
        while True:
            if len(answer7) == 3:
                break
            answer7 += answer6[-1]
    else:
        answer7 += answer6
    # print('7', answer7)

    return answer7

3. 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환 에서 막혔다. 다양한 방법으로 시도했는데 잘 안돼서 찾아보니 너무 간단해서 현ㅌㅏ..
3번 이외에도 전부 간단한 풀이가 많았다. 내가 너무 어렵게 푼 듯..
나는 answer을 정확하게 지키려고(?) answer을 매 코드마다 새로 할당했는데,
answer 자체 하나로도 충분히 풀 수 있었던 것 같다.

<찾아본 코드>

def solution(new_id):
    answer = ''

    # 1. 입력받은 문자열에서 대문자 찾아 소문자로 변경
    new_id = new_id.lower()

    # 2. 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 를 제외한 모든 문자 제거
    for x in new_id:
        if x.isalpha() or x.isdigit() or x in ['-', '_', '.']:
            answer += x

    # 3. 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
    while '..' in answer:
        answer = answer.replace('..', '.')

    # 4. 마침표(.)가 처음이나 끝에 위치한다면 제거
    if answer[0] == '.':
        answer = answer[1:] if len(answer) > 1 else '.'
    if answer[-1] == '.':
        answer = answer[:-1]

    # 5. 빈 문자열이라면 'a' 대입
    if answer == '':
        answer = 'a'

    # 6. 길이가 16자 이상이면, 문자열의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거
    if len(answer) > 15:
        answer = answer[:15]
    #    만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
        if answer[-1] == '.':
            answer = answer[:-1]

    # 7. 길이가 2자 이하라면, 문자열의 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙임
    while len(answer) < 3:
        answer += answer[-1]

    return answer

좋은 웹페이지 즐겨찾기