본문 바로가기

Algorithm

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

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

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

생각

문자열은 파이썬 감도 살릴겸 계속 파이썬으로 연습해야겠습니다!

 

파이썬에서 list를 반복문을 돌며 remove와 같은 업데이트 연산을 해줘야할땐 직접 list에 접근하지 않고 리스트 슬라이싱(for item in origin_list[:])으로 작업하면 됩니다.

 

3번째 단계에서 .이 두번이상연속되면 .을 하나로 치환해야 합니다. 저는 연속된 . 을 카운트하고 . 이 아니라면 cnt = 0 으로 초기화했습니다. 반복문을 돌면서 문자가 . 이고 cnt = 0 이면 임시결과에 문자를 누적합니다. 만약 .이 아닌 문자라면 바로 누적해줍니다.

 

(참고 : 3번 조건 더 나은 코드)

    # 3
    while '..' in answer:
        answer = answer.replace('..', '.')

Python Code

def solution(new_id):
    answer = ''
    #1. 모두 소문자로 치환
    new_id = new_id.lower()
    #2. 소문자 숫자 - _ . 제외 모든 문자 제거
    
    for c in new_id[:]:
        if c.islower(): answer += c
        if c.isdigit(): answer += c
        if c in ['-', '_', '.'] : answer += c
    #print("2단계",temp)

    #3. ..이 2번이상연속되면 . 하나로 치환
    cnt = 0
    tmp = []
    for i, c in enumerate(answer) :
        if c == '.': 
            if cnt == 0:    
                tmp += c
            cnt+=1
        else:
            cnt = 0
            tmp += c # . 아니면 바로 누적
    #print("3단계",tmp)

    #4 . 처음이나 끝이면 제거
    if(tmp[0] == '.'): tmp.pop(0)
    if(len(tmp) > 0 and tmp[-1] == '.'): 
        if len(tmp) > 0:
            tmp.pop(-1)
    #print("4단계",tmp)

    #5. 빈 문자열이면 a를 대입
    if len(tmp) == 0 : tmp += 'a'
    #print("5단계",tmp)

    #6. 길이 16이상이면, 첫 15개 제외 나머지 제거
    if len(tmp) >= 16 : 
        tmp = tmp[:15]
        if tmp[-1] == '.' : tmp = tmp[:-1]
    #print("6단계",tmp)

    #7. 길이 2자 이하, 
    if len(tmp) <= 2:
        c = tmp[-1]
        while(True):
            if(len(tmp) == 3) : break
            tmp += c
    
    answer = "".join(tmp)
    # print("7단계",answer)
    return answer