PS (Problem Solving)/Programmers

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

캐럿노트 2022. 7. 28. 22:48

문제

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

설계

- 단계별 구현력을 요구하는 문제라고 생각했다.

 

풀이

- 2단계는 아스키 코드를 사용하여 1중 for문으로 제거했다.

- 테스트케이스를 절반 이상 틀렸는데 3단계 마침표 중복 치환을 수정하고 통과했다.

def solution(new_id):
    # 1단계 : 모두 소문자
    new_id = new_id.lower()

    # 2단계 : 사용 불가능 문자 제거
    arr = list(new_id)
    for i in range(len(arr)-1, -1, -1):
        if (45 <= ord(arr[i]) and ord(arr[i]) <=46) or \
                (48 <= ord(arr[i]) and ord(arr[i]) <= 57) or \
            (97 <= ord(arr[i]) and ord(arr[i]) <= 122) or \
                (ord(arr[i]) == 95):
            continue
        arr.pop(i)

    # 3단계 : 마침표 중복 치환
    for i in range(len(arr)-1, 0, -1):
        if arr[i] == '.' and arr[i-1] == '.':
            arr.pop(i)

    # 4단계 : 마침표(.)가 처음이나 끝에 위치한다면 제거
    if arr[0] == '.':
        arr.pop(0)
    if len(arr) > 0 and arr[-1] == '.':     # len(arr) > 0 : index error 방지
        arr.pop()

    # 5단계 : 빈 문자열이라면 a를 대입
    if arr == []:
        arr.append('a')
    for i in range(len(arr)):
        if arr[i] == ' ':
            arr[i] = 'a'

    # 6단계 : 길이가 16자 이상이면 제거, 제거 후 끝에 마침표가 있으면 추가로 제거
    if len(arr) >= 16:
        arr = arr[0:15]
    if arr[-1] == '.':
        arr.pop()

    # 7단계 : 길이가 2자 이하라면, 마지막 문자를 길이가 3이 될 때까지 반복해서 끝에 붙인다
    while len(arr) <= 2:
        arr.append(arr[-1])

    answer = ''.join(arr)   # 리스트 -> 문자열로 합치기
    return answer