본문 바로가기
Problem Solving/카카오 코딩테스트

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

by ggyongi 2021. 4. 25.
반응형

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

 

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

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

programmers.co.kr

def solution(new_id):
    new_id = new_id.lower()
    re = ''
    for char in new_id:
        if char.isalnum() or char in "-_.":
            re += char
    
    del_dot = ''
    for char in re:
        if not del_dot:
            del_dot += char
            continue
        if del_dot[-1]=='.' and char=='.':
            continue
        else:
            del_dot += char
    if del_dot and del_dot[-1] == '.':
        del_dot = del_dot[:-1]
        
    if del_dot and del_dot[0] == '.':
        del_dot = del_dot[1:]
        
    if not del_dot:
        del_dot = 'a'
    
  
    if len(del_dot)>=16:
        del_dot = del_dot[:15]   
        if del_dot[-1]=='.':
            del_dot = del_dot[:-1]
    
   
    if len(del_dot)<=2:
        del_dot += del_dot[-1]
        del_dot += del_dot[-1]
        del_dot = del_dot[:3]
        
        
    return del_dot

풀긴하였지만 굉장히 시간이 많이 소요됐다. 실전이었으면 못풀었다.

구현문제가 생각할 것도 많고 예외도 많아서 정말 어려운 것 같다. 

 

<개선할 점>

3단계 개선: 반복되는 2개 이상의 점 '..' ->'.' 으로 줄이기 => 아래처럼 while과 replace()를 쓰면 매우 쉽게 할 수 있다..

 ### before ####
    del_dot = ''
    for char in re:
        if not del_dot:
            del_dot += char
            continue
        if del_dot[-1]=='.' and char=='.':
            continue
        else:
            del_dot += char
 
 ### after ####
    while '..' in re:
        re = re.replace('..','.')

5단계 개선: 이 정도는 한줄로도 가능하다.

    ### before    
    if not del_dot:
        del_dot = 'a'
    
    ### after
	del_dot = 'a' if not del_dot else del_dot

6단계 개선: 슬라이싱은 인덱스 예외 에러가 나지 않기때문에 if 조건문은 사실 필요없다.

#### before ####
if len(del_dot)>=16:
        del_dot = del_dot[:15]   
        if del_dot[-1]=='.':
            del_dot = del_dot[:-1]
    
#### after ####
  del_dot = del_dot[:15]   
      if del_dot[-1]=='.':
          del_dot = del_dot[:-1]

 

최종:

def solution(new_id):
    new_id = new_id.lower()
    re = ''
    for char in new_id:
        if char.isalnum() or char in "-_.":
            re += char
    
    while '..' in re:
        re = re.replace('..','.')
    
    if  re[-1] == '.':
        re = re[:-1]
        
    if re and re[0] == '.':
        re = re[1:]
        
    re = 'a' if not re else re
  
    re = re[:15]   
    if re[-1]=='.':
        re = re[:-1]
   
    if len(re)<=2:
        re += re[-1]
        re += re[-1]
        re = re[:3]
        
    return re

다른 사람 풀이보면 정규식을 활용해서 기가 막히게 풀었다. 정규식을 잘 알면 문자열 관련 구현 문제에서 큰 힘을 발휘할 수 있을 것 같다. 

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글