아는 만큼 보인다

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

알고리즘&자료구조/코딩테스트 연습

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

계토 2022. 6. 16. 22:27

프로그래머스 신규 아이디 추천 python3 문제 바로가기

 

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

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

programmers.co.kr

이번에 기억해야할 것,

list로 for loop 돌릴 때, pop()을 사용하는 것은 웬만하면 피하거나 무척 조심하도록 하자..! 

특히, 해당 list에서 range(len(list))를 사용해서 인덱스로 루프를 도는데 바로 그 list에서 pop을 써버리면 index error가 발생하기 쉽다.. 그래서 웬만하면 빈 list를 다시 만들고 안에 value들을 다시 추가하는 방식으로 생각해보도록 하자.

이번에도 그 에러가 많이 났었다.

 

나머지는... 조건들을 가끔 빼먹어서 ;;; 에러가 났었고

이 문제는 그렇게 복잡한 알고리즘적 지식을 요구하는 건 아니었던 것 같다?! 

그러나 기본에 충실할 것.

 

또, 다른 사람들의 풀이를 보니 step3 같은 건 더 간결하게 풀 수 있었던 것 같다. 코드 넘 더러오! 

 

def solution(new_id):
    # step1
    new_id = new_id.lower()
    # step2
    new_id_2 = []
    for spell in new_id:
        if spell.islower() or spell.isalpha() or spell.isnumeric() or spell == '-' or spell == '_' or spell == '.':
            new_id_2.append(spell)
    # step3
    count_dot = 0
    new_id_3 = []
    for s in range(len(new_id_2)):
        if new_id_2[s] == '.':
            count_dot += 1
            if count_dot == 2:
                count_dot -=1
            else:
                new_id_3.append(new_id_2[s])
        else:
            count_dot = 0
            new_id_3.append(new_id_2[s])
    # step4
    if len(new_id_3) != 0:
        if new_id_3[0] == '.':
            new_id_3.pop(0)
    if len(new_id_3) != 0:
        if new_id_3[-1] == '.':
            new_id_3.pop(-1)
    
    # step5
    if len(new_id_3) == 0:
        new_id_3.append("a")
    # step6
    if len(new_id_3) >= 16:
        new_id_6 = new_id_3[0:15]
        if new_id_6[-1]=='.':
            new_id_6.pop(-1)
    else:
        new_id_6 = new_id_3
            
    
    # step7
    if len(new_id_6) <=2:
        last = new_id_6[-1]
        while len(new_id_6) < 3:
            new_id_6.append(last)
            
    
    
    answer = ''.join(new_id_6) # 추천아이디
    return answer

다른 사람의 풀이를 참고하여 다시 작성한 코드

 

일단 두번째 스텝에서, or을 너무 많이 쓰지 말고 in 과 list를 사용하였다.

세번째 스텝에서는 계속 루프를 도는 것도 생각못했던 것은 아닌데 시간이 너무 오래걸릴까봐(?) 지레 피했던 건데, 코드 자체는 깔끔해졌다. 하지만 효율성 측면에서는 얼마나 좋을지는 모르겠다. 내가 짰던 코드는 그래도 한번만 loop를 돌면 되어서..!

 

그리고 나는 막 변수를 new_id, new_id_2, new_id_6으로 짜서 너무 비직관적이었는데 그냥 계속 새롭게 변수를 업데이트하는 아래 방식으로 짜는게 더 깔끔하고, 중간에 코드를 고치게 되더라도 뒤에 있는 코드까지 막 연쇄적으로 고쳐야하는 일이 발생하지 않을 것 같다. 

 

다른 사람 코드까지 참고해보니 확실히 도움이 되는 것 같다! 더 효율적인 방법이 있고 그걸 배우면 되니까! 나의 코드는 덜 정제된 느낌이랄까,, 

 

def solution(new_id):
    answer = ''
    # 1
    new_id = new_id.lower()
    
    # 2
    for s in new_id:
        if s.isalpha() or s.isdigit() or s in ['-', '_', '.']:
            answer += s
            
    # 3
    while '..' in answer:
        answer = answer.replace('..', '.')
    
    # 4
    if len(answer) != 0:
        if answer[0] == '.':
            answer = answer[1:]
    if len(answer) != 0:
        if answer[-1] == '.':
            answer = answer[:-1]
    
    # 5
    if len(answer) == 0:
        answer = "a"
        
    # 6
    if len(answer) >= 16:
        answer = answer[0:15]
        if answer[-1]=='.':
            answer = answer[:-1]
            
    
    # 7
    if len(answer) <=2:
        last = answer[-1]
        while len(answer) < 3:
            answer += last

    return answer