본문 바로가기

programming/코테연습

[python] 프로그래머스 신규 아이디 추천 - level1

728x90
반응형

맨날 자바로 하다가 처음으로 python을 사용해서 풀어봤는데, 코드도 훨씬 간단하고 쉬워서 앞으로 계속 파이썬으로 풀 생각이다. 

 

일단 문제부터 보면, 

 

단계별로 규칙에 맞지 않는 아이디를 변환시켜주면 된다. 

물론 구글링을 계속해서 문제를 풀긴 했지만 검색하면서 파이썬 문법을 이것저것 배워서 정리겸 복습을 해보려고 한다. 

 

우선 전체 코드

 

import re

def solution(new_id):
    answer = ''
    #1단계
    new_id=new_id.lower()
    #2단계
    new_id=re.sub('[~!@#$%^&*\(\)=+\[\{\]\}:?,\<\>/]', '', new_id)
        
    #print(new_id)
    #3단계
    new_id=re.sub('\.+', '.', new_id)
    
    #4단계
    if len(new_id) > 0 :
        if new_id[0]==".":
            new_id=new_id[1:]
    if len(new_id) > 0 :  
        if new_id[-1]==".":
            new_id=new_id[:-1]
    
    #5단계
    if len(new_id) == 0:
            new_id="a"
    
    #6단계
    if len(new_id) > 15:
        new_id=new_id[:15]
        if new_id[-1] ==".":
            new_id=new_id[:-1]
    
    #7단계
    while len(new_id) < 3:
        new_id+=new_id[-1]
        
                     
            
    print(new_id,end="")
    answer=new_id
    return answer

1단계 

대문자-> 소문자 

#1단계
new_id=new_id.lower()

lower()을 사용해서 소문자로 변경. 반대의 경우 .upper() 사용

 

 

2단계

몇개의 특정한 문자를 제외한 특수문자 제거

 #2단계
new_id=re.sub('[~!@#$%^&*\(\)=+\[\{\]\}:?,\<\>/]', '', new_id)

re.sub를 이용해서 전부 공백으로 치환하는 1차원적인 코드를 사용했는데, 다른 사람들의 풀이를 보니

정규식을 활용한게 있어 같이 공부해봤다. 

st = re.sub('[^a-z0-9\-_.]', '', st)

대문자는 이미 1단계에서 제거해줬기 때문에 a-z, 숫자, 그리고 -_.을 제외한 나머지 (^)를 제거 하고 공백으로 만들라는 뜻이다. 

역슬러쉬는 파이썬 정규식에서 메타문자에 해당하는데, 뒤에있는 문자를 문자열 그대로 읽으라는 뜻이다. 

-가 마이너스가 아닌 문자열로 인식되기 위해 사용한거 같다. 

 

3단계

..이 두번이상 반복되면 .을 하나로 만들어야 하는 코드였다. 개인적으로 제일 어려웠고, 가장 나중에 풀 수 있었다.

 #3단계
    new_id=re.sub('\.+', '.', new_id)

정규식을 이용하면 굉장히 간단하게 풀 수 있었다. 

+ 메타문자는 최소 1번이상을 계속해서 반복할 수 있다는 뜻이다. 위에서 썼듯이 역슬러쉬는 문자열 그대로를 읽으라는 뜻이다 (.역시 사이 문자라는 뜻을 가진 메타문자이다)

 

다른 사람의 풀이도 쉽고 간단해서 가져와봤다.

while '..' in answer:
 answer = answer.replace('..', '.')

..이 두개 이상 있으면 .하나로 replace하는 while문이다. 

두개 이상이면 무조건 while문이 돌아가기 때문에 결국 .개만 남을때까지 반복문을 수행한다. 

 

4단계

마침표가 맨 앞이나 뒤에 있으면 삭제하는 코드

#4단계
    if len(new_id) > 0 :
        if new_id[0]==".":
            new_id=new_id[1:]
    if len(new_id) > 0 :  
        if new_id[-1]==".":
            new_id=new_id[:-1]

코드를 계속 돌려가면서 풀어본 결과 몇개 예시들은 위의 단계들을 거치면서 길이가 0이 되기도 했다. 

그래서 if문을 수행못하는 경우가 있었어서, 꼭 if문을 하나 더 써서 길이가 0 이상일때만 실행될 수 있도록 했다. 

 

그리고 문자열 슬라이싱을 사용하여 문제를 더욱 간단히 풀 수 있다.

파이썬에서 문자열 인덱스는 0부터 시작하고, 마지막 문자열은 -1부터 시작한다. 

인덱스로 슬라이싱이 가능한데, 예를 들어

a = 'nct dream'

이라는 문자열이 있다고 치면

a[0] = n

a[1] = c

a[2] = t

a[3] = ' ' (공백도 포함)

a[4] = d

a[5] = r

a[6] = e

a[7] = a

a[8] = m

 

이고, 

 

a[-1]은 m부터 시작한다. 

 

여기서 슬라이싱을 연습하면

a[0:3] = 'nct'
a[0:2] = 'nc'
a[0:4] = 'nct '
a[4:] = 'dream'

a[0:2]이라고 할때 nct가 나오지 않고 nc가 출력되는 이유는 끝번호인 a[2]의 t가 포함되지 않기 때문이다.

수식으로 생각하면

0<=a<2

라고 볼 수 있다. 이상 미만으로 생각하면 된다. 

 

그럼 예제로 돌아와서 가장 앞의 인덱스와 뒤의 인덱스를 제거하기 위해서는 

0인덱스를 제외한 나머지 전부를 잘라오고, -1인덱스를 제외한 나머지 전부를 잘라오면 된다. 

 if len(new_id) > 0 :
        if new_id[0]==".":
            new_id=new_id[1:]
    if len(new_id) > 0 :  
        if new_id[-1]==".":
            new_id=new_id[:-1]

그래서 이런 코드를 사용할 수 있다. 

 

5단계 문자가 공백이면 a를 채운다

if len(new_id) == 0:
            new_id="a"

너무 쉬우니까 패스

 

6단계

16글자 이상이면 15자까지만 남기고 뒤에는 자른다.  

#6단계
    if len(new_id) > 15:
        new_id=new_id[:15]
        if new_id[-1] ==".":
            new_id=new_id[:-1]

인덱스로는 15번째 앞까지 잘라야하는게 맞아서 new_id[:15]를 써준다. 

만약 이렇게 처리 했는데 가장 뒤의 글자가 .이면, 다시 맨뒤의 점을 잘라낸다. 

 

7단계 아이디가 3자리 미만이면 세자리가 될때까지 맨 뒤의 글자를 반복한다.

 #7단계
    while len(new_id) < 3:
        new_id+=new_id[-1]

아이디가 한자리 일지 두 자리일지 모르기 때문에 3이 되기 전까지 while문을 돌려준다. 

그리고 가장 마지막글자를 계속해서 추가해주면 마지막까지 완성이 된다. 

 

이렇게 한 번 정리하고 나니 파이썬 개념이 더욱 잡히는거 같다. 

 

 

728x90
반응형