티스토리 뷰

728x90
반응형

 

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

 

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

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

programmers.co.kr

 

 


 

 

<나의 풀이>

def solution(new_id):
    answer = []
    
    # 2단계를 위해 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 추가한 리스트 생성
    check = [str(i) for i in range(0, 10)] + [chr(i)
                                              for i in range(97, 123)] + ['-', '_', '.']

    # 1 : 모든 대문자를 대응되는 소문자로 치환
    new_id = list(new_id.lower())

    # 2 : 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)이면 추가
    for i in new_id:
        if i in check:
            answer.append(i)

    # 3 : 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
    # 연속으로 나왔을 경우 앞에 있는 마침표를 공백으로 바꿔준 후 제거함
    for i in range(len(answer)-1):
        if (answer[i] == '.') and (answer[i+1] == '.'):
            answer[i] = ' '
    answer = "".join(answer).replace(' ', '')

    # 4 : 마침표(.)가 처음이나 끝에 위치하면 슬라이싱을 이용해 제거
    if (len(answer) >= 1):
        if (answer[0] == '.'):
            answer = answer[1:]
    if (len(answer) >= 1):
        if (answer[-1] == '.'):
            answer = answer[:-1]

    # 5 : 빈 문자열이라면, new_id에 "a"를 대입
    if len(answer) < 1:
        answer += 'a'

    # 6 : 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거
    if len(answer) >= 16:
        answer = answer[:15]

    # 7 : 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙임
    elif len(answer) <= 2:
        while(len(answer) < 3):
            answer += answer[-1]

    # 단계를 마친 후에 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
    if (answer[-1] == '.'):
        answer = answer[:-1]
    return answer

 

 

3단계에서 애먹은 문제ㅠㅠㅠ

다른 사람의 풀이를 보니 생각보다 단순해서 또 한번 깨달음을 얻었다!

 

 

 

<다른 사람의 풀이>

def solution(new_id):
    answer = ''
    # 1
    new_id = new_id.lower()
    # 2
    for c in new_id:
        if c.isalpha() or c.isdigit() or c in ['-', '_', '.']:
            answer += c
    # 3
    while '..' in answer:
        answer = answer.replace('..', '.')
    # 4
    if answer[0] == '.':
        answer = answer[1:] if len(answer) > 1 else '.'
    if answer[-1] == '.':
        answer = answer[:-1]
    # 5
    if answer == '':
        answer = 'a'
    # 6
    if len(answer) > 15:
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:-1]
    # 7
    while len(answer) < 3:
        answer += answer[-1]
    return answer
    
    
# <배운점> 
# => 3단계 부분에서 '..'으로 연속된 마침표의 점을 찾는 점 

 

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
        
    
# <배운점> 
# => 역시 정규표현식이 최고라는 점... 코드도 간결하고 시간도 훨씬 절약할 수 있더라ㅠㅠㅠ
728x90
반응형
댓글