코딩테스트

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

pythaac 2021. 8. 7. 16:32
프로그래머스 코딩테스트 고득점 Kit의 문제입니다.

https://programmers.co.kr/learn/challenges?tab=algorithm_practice_kit

 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

문제

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

 

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

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

programmers.co.kr

 

내가 작성한 코드

# 1차 작성 ---------------
def solution(new_id):
    tmp = []

    # 1
    for c in new_id:
        if 'A' <= c <= 'Z':
            c = chr(ord('a') + ord(c) - ord('A'))
        tmp.append(c)
    answer = tmp
    tmp = []

    # 2
    for c in answer:
        if 'a' <= c <= 'z' or '0' <= c <= '9' or c == '-' or c == '_' or c == '.':
            tmp.append(c)
    answer = tmp
    tmp = []

    # 3
    for i in range(len(answer)):
        if tmp and tmp[-1] == '.' and answer[i] == '.':
            continue
        tmp.append(answer[i])
    answer = tmp

    # 4
    while answer and answer[0] == '.':
        answer.pop(0)
    while answer and answer[-1] == '.':
        answer.pop()

    # 5
    if not answer:
        answer.append('a')

    # 6
    answer = answer[:15]
    while answer and answer[0] == '.':
        answer.pop(0)
    while answer and answer[-1] == '.':
        answer.pop()

    # 7
    while answer and len(answer) <= 2:
        answer.append(answer[-1])

    return ''.join(answer)


# 2차 작성 ---------------
import re

def solution(new_id):
    answer = new_id

    # 1
    answer = answer.lower()

    # 2
    answer = re.sub("[^a-z0-9-_.]", "", answer)

    # 3
    answer = re.sub("\.{2,}", ".", answer)

    # 4
    answer = list(answer)
    while answer and answer[0] == '.':
        answer.pop(0)
    while answer and answer[-1] == '.':
        answer.pop()

    # 5
    if not answer:
        answer.append('a')

    # 6
    answer = answer[:15]
    while answer and answer[0] == '.':
        answer.pop(0)
    while answer and answer[-1] == '.':
        answer.pop()

    # 7
    while answer and len(answer) <= 2:
        answer.append(answer[-1])

    return ''.join(answer)
  • 기억이 안난 게 많다
    • lowercase라 썼는데 안되고
    • lower()가 str을 return하는지 in-place인지 헷갈리고
    • re.sub에 인자 위치가 헷갈리고
    • 리스트 슬라이싱에서 [:16]이라고 해야 15번째까지 나오는걸로 헷갈렸다

다른 사람이 작성한 코드

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
  • 모든 단계를 한줄로 작성함
    • regex에서 {2,} == +
    • regex에서 문장의 맨 앞은 ^ / 맨 뒤는 $

기억해야할 것

  • lower()
  • re.sub(exp, replace, target)
  • regex를 좀 더 효율적으로 활용하면 좋겠다