[프로그래머스 / Level 1] 신규 아이디 추천 (파이썬) 2021 Kakao Blind Recruitment

khyojun·2022년 7월 10일
0

코테연습

목록 보기
3/21

📌문제 설명

📌제한 사항

newid는 길이 1 이상 1,000 이하인 문자열입니다.
new_id는 알파벳 대문자, 알파벳 소문자, 숫자, 특수문자로 구성되어 있습니다.
new_id에 나타날 수 있는 특수문자는 -
.~!@#$%^&*()=+[{]}:?,<>/ 로 한정됩니다.

📌 Solution
이번 문제를 푸는 것은 문제의 조건에 맞게 차근차근 구현을 해나가면 되었다.
그러나 파이썬에 아직 익숙치 않아 여러 문자열 함수들을 사용해나가야했는데 아래와 같이 작성한 코드는 정답이긴 하지만 효율적이진 못한 부분이 있다.

def solution(new_id):
    answer = ''
    #1단계
    answer=new_id.lower()
        
    #2단계
    s=list(answer)
    i=0  
    while i < len(s):
        now=ord(s[i])
        if (now>=ord('a') and now<=ord('z')) or (now == ord('-')) or (now == ord('_')) or (now == ord('.')) or(now >=ord('0') and now <= ord('9')):
            i=i+1
            continue
        else:
            del(s[i])
    
    answer="".join(s)
    
    #3단계
    while '..' in answer:
        answer=answer.replace('..', '.')
    
    #4단계
    answer=answer.strip('.')
        
    #5단계
    if not answer:
        answer='a'
        
    #6단계
    s=list(answer)
    if len(s)>=16:
        del(s[15:])  
        if s[14]=='.':
            del(s[14])
    
    
    #7단계
    while len(s)<=2:
        s.append(s[-1])
    
            
    answer="".join(s)
    
    return answer

그래서 아래의 코드를 참고해봤다.

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

애초에 2번의 기나긴 조건문이 아닌 애초부터 문자열로 받아들여서 isalpha(), isdigit()을 통하여 숫자인지 알파벳인지 구분하고 뒤의 in ['-', '_', '-']를 통하여 확인하는 것이 가독성에 훨씬 도움되고 효율적인것을 알게 되었다.

문제 해결하며 알게 된 점

  1. 파이썬에는 여러 문자열 관련 함수들이 많다. 이것을 많이 참고하여 익힐 수 있도록 해야겠다.
    이번 문제에서는 isdigit(), isalpha() 그리고 문자열 슬라이싱이 많이 활용이 되었다.
  2. 그리고 문자열을 리스트로 변환시킨후 다시 문자열로 변환시킬때는 "".join(문자열)을 활용한다.
profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글