데이터사이언스 기록기📚

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

Coding Test/프로그래머스(Python)

[프로그래머스] Level 1_신규 아이디 추천

syunze 2022. 7. 4. 15:41

문제 유형

2021 KAKAO BLIND RECRUITMENT

 

문제

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

 

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

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

programmers.co.kr

 

나의 문제풀이

- 문제점

  • 4번(처음/끝 . 제거)에서 answer가 비어있을 때를 고려하지 않음
  • 사용가능한 특수문자 꼭 확인하기(, 비어있었음)
def solution(new_id):
    answer = ''
    no_id = ['~','!','@','#','$','%','^','&','*','(',')','=','+','[','{','}',']',':','?','<','>','/',',']
    
    # 1_소문자 변경
    new_id = new_id.lower()
    
    # 2_필요없는 문자 삭제
    for letter in no_id:
        if letter in new_id:
            new_id = new_id.replace(letter,'')
            
    # 3_.2번 이상일 때 삭제
    answer += new_id[0]
    for i in range(1,len(new_id)):
        if answer[len(answer) - 1] == '.' and new_id[i] == '.':
            continue
        else:
            answer += new_id[i]
            
    # 4_.처음/끝 제거
    if answer != '':
        if answer[0] == '.':
            answer = answer[1:]
        
    if answer != '':
        if answer[len(answer) - 1] == '.':
            answer = answer[:-1]
        
    # 5_비었을 때 'a' 채워넣기
    if answer == '':
        answer += 'a'
        
    # 6_16자 이상인 경우 1~15자만 남기고 삭제!
    if len(answer) > 15:
        answer = answer[:15]
        if answer[len(answer) - 1] == '.':
            answer = answer[:-1]
            
    # 7_길이 2이하, 마지막 문자 3이상까지 반복
    if len(answer) < 3:
        while True:
            answer += answer[len(answer) - 1]
            if len(answer) == 3:
                break
        
    return answer

 

다른 사람의 풀이

1) 정규표현식 이용하기

  •  re.sub(바꿀 문자, 바꿔질 문자, 저장 위치)
  • [] : [] 사이의 문자들과 매치
  • ^ : 반대(not)의 의미
  • $ : 문자열의 끝

https://ponyozzang.tistory.com/335

 

Python 정규 표현식(re.sub)을 이용한 문자열 치환 방법 및 예제

파이썬에서 문자열을 치환해주는 메서드로 replace가 있습니다. 이번에는 replace 메서드로 문자열을 치환하는 방법이 아닌 정규 표현식을 이용하여 문자열을 치환해보도록 하겠습니다. 정규 표현

ponyozzang.tistory.com

https://sooftware.io/regex/

 

정규표현식 (regex)

정규 표현식 정규표현식(regular expression)은 일종의 문자를 표현하는 공식으로, 특정 규칙이 있는 문자열 집합을 추출할 때 자주 사용되는 기법입니다. 주로 Prograaming Language나 Text Editor…

sooftware.io

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에 없을 때 'a'추가, 나머지 경우 15번째 까지
    st = re.sub('^[.]|[.]$', '', st)
    st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])		# join 이용해서 같은 문자 반복
    return st

 

 

 2) str함수 사용

 - str 함수

  • isalpha() : 문자열로만 이루어져 있는지 확인하는 함수
  • isdigit() : 숫자로만 이루어져 있는지 확인하는 함수
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

 

리뷰

 - 문자열 사용할 때 슬라이싱정규표현식 사용하기

 - while문 더 간결하게 짤 수 있도록 노력하기

728x90
Comments