알고리즘 스터디 2021.07~

[프로그래머스] 2021 카카오 신규 아이디

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


풀이

정말 명세서 혹은 기획서와 유사하게 조건이 주어지고 조건에 맞게 코딩하는 문제였다

파이썬이 익숙치 않아 검색을 좀 했다

 

1. 소문자로 변경 https://blockdmask.tistory.com/416 

2. 반복문을 돌며 제거하는 방법 https://devpouch.tistory.com/110

3. 스트링을 리스트로 https://codechacha.com/ko/python-convert-string-to-char-list/ 

4. 리스트가 비었는지 확인 https://hashcode.co.kr/questions/22/%EB%B9%88-%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC-%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%84-%EA%B0%80%EB%A5%B4%EC%B3%90%EC%A3%BC%EC%84%B8%EC%9A%94

def solution(new_id):
    
    new_id = new_id.lower()
    print(new_id)
    
    new_id = list(new_id)
    for i in new_id[:]: # 조건2, 제대로 지워질 수 있도록 복사본으로 반복
        if i == '.' or i == '-' or i == '_' or (i <= 'z' and i >= 'a') or (i <= 'Z' and i >= 'A') or (i >= '0' and i <= '9'):
            continue
        new_id.remove(i)
    
    new_id2 = []
    for i in range(len(new_id) - 1): # 조건3
        if not (new_id[i] == '.' and new_id[i+1] == '.'):
            new_id2.append(new_id[i])
    
    if new_id[-1] != '.': # 조건 4
        new_id2.append(new_id[-1])
    if new_id2 and new_id2[0] == '.':
        new_id2.pop(0)
    new_id = new_id2
    
    if not new_id: # 조건 5
        new_id = ['a']
    
    new_id = new_id[:15] # 조건 6
    if new_id and new_id[-1] == '.':
        new_id.pop()
        
    for i in range(3): #조건 7
        if len(new_id) < 3:
            new_id.append(new_id[-1])
    
    
    return ''.join(new_id)

대박 지저분;;

 


다른 사람의 풀이

import re

def solution(new_id):
    st = new_id
    st = st.lower()
    st = re.sub('[^a-z0-9\-_.]', '', st)
    st = re.sub('\.+', '.', st)
    st = re.sub('^[.]|[.]$', '', st)
    st = 'a' if len(st) == 0 else st[:15]
    st = re.sub('^[.]|[.]$', '', st)
    st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
    return st

정규식으로 완전 깔끔하게 푸셨다.

파이썬에서는 정규식을 한 번도 안 써 봐서 시도를 못 해봤는데, 이번 기회에 조금 익혀간다.

파이썬 정규식 설명 - https://wikidocs.net/4308