[프로그래머스 | 파이썬] 신규 아이디 추천

devheyrin·2022년 6월 2일
0

codingtest

목록 보기
47/65

문제 링크

https://programmers.co.kr/learn/courses/30/lessons/72410

코드

def solution(new_id):
    # 1단계 - 대문자 -> 소문자 
    new_id = new_id.lower()

    # 2단계 - 특수문자 제거 
    answer = ''
    for chr in new_id:
        if chr.isalnum() or chr in '-_.':
            answer += chr

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

    # 4단계 - .가 처음이나 끝에 위치한다면 제거 
    if answer[0] == '.':
        answer = answer[1:]
    if answer and answer[-1] == '.':
        answer = answer[:-1]

    # 5단계 - 빈 문자열이면 a를 대입 
    if not answer:
        answer = 'a'
    # 6단계 - 길이가 16자 이상이면 첫 15개 문자를 제외하고 나머지 모두 제거
    if len(answer) >= 16:
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:-1]
    # 7단계 - 길이가 2자 이하라면 new_id 의 마지막 문자를 new_id의 길이가 3일 때까지 반복해서 끝에 붙이기
    while len(answer) <= 2:
        answer += answer[-1]

    return answer

풀이 설명

단계별로 착실하게 구현하면 되는 문제였다.
주의할 점이라면 4단계 구현 시 경우에 따라 out of range 를 만날 수도 있다는 점이다.
테스트케이스 3번 =.=를 4단계 수행하고 나면 빈 문자열이 되므로, answer[-1] 은 검사할 수 없기 때문이다. 빈 문자열이 아닌 경우에만 -1 인덱스에 접근하도록 수정해주면 된다.
또 하나, 6단계 구현 시에도 주의해야 할 점이 있다.
테스트케이스 6번에서 abcdefghijklmn.p 가 주어지는데, 6단계를 수행하면서 abcdefghijklmn. 가 된다. 이 때 마지막 문자열이 . 일 경우를 처리해주지 않으면 틀린다.

profile
개발자 헤이린

0개의 댓글