알고리즘

[프로그래머스 Lv1 - 2021 KAKAO BLIND RECRUITMENT] 신규 아이디 추천 (Python)

lwkejpf 2022. 6. 30. 07:06


def StringRemove(new_id) :
    for id in new_id :
        id_type = type(id)
    if id_type == int :
        pass
    if (ord(id) >= 97 and ord(id) <= 122) or id in ['-', '_', '.'] :
        pass
    else :
        new_id = new_id.replace(id, '')
    return new_id

def FinalProcess(new_id) :
    if len(new_id) == 0 :
        new_id = 'a'
    elif len(new_id) >= 16 :
        new_id = new_id[:15]
        new_id = new_id.rstrip('.')
    if len(new_id) <= 2 :
        while (True) :
            if len(new_id) == 3 :
                break
            else :
                new_id += new_id[-1]
    return new_id

def CombineDot(new_id) :
    idx = [i for i, x in enumerate(new_id) if x == '.']
    i = 0
    while (i < len(idx)-1) :
        if idx[i] + 1 == idx[i+1] :
            new_id[i:i+2].replace('..', '.')
    return new_id

def solution(new_id):
    id = new_id.lower()
    id = StringRemove(id)
    id = CombineDot(id)
    id = new_id.strip('.')
    id = FinalProcess(id)

    return id

 

 

또또 ...... 그놈의 시간초과...

근데 누가봐도 효율성 없이 짜긴 함 ㅋ

 

시간 초과 말고도 그냥 실패뜬 것도 있길래 왜지? 했는데

누가.. 타입 검사를 ..

 

 if id_type == int :

 

이렇게.. 하나? 

 


 

 

def StringRemove(new_id) :
    for id in new_id :
        try :
            id = int(id)
        except :
            if (ord(id) >= 97 and ord(id) <= 122) or id in ['-', '_', '.'] :
                pass
            else :
                new_id = new_id.replace(id, '')
    return new_id

def FinalProcess(new_id) :
    if len(new_id) == 0 :
        new_id = 'a'
    elif len(new_id) >= 16 :
        new_id = new_id[:15]
        new_id = new_id.rstrip('.')
    if len(new_id) <= 2 :
        while (True) :
            if len(new_id) == 3 :
                break
            else :
                new_id += new_id[-1]
    return new_id

def CombineDot(new_id) :
    idx = [i for i, x in enumerate(new_id) if x == '.']
    i = 0
    while (i < len(idx)-1) :
        if idx[i] + 1 == idx[i+1] :
            new_id[i:i+2].replace('..', '.')
    return new_id

def solution(new_id):
    id = new_id.lower()
    id = StringRemove(id)
    id = CombineDot(id)
    id = id.strip('.')
    id = FinalProcess(id)

    return id

 

그래서 try-except 문으로 숫자인지 검사하고 

오류나면 문자라는 거니까 except 안에 넣어줬다..!!

 

 

그랬지만

 

 

그래도 .. 이제 시간초과만 해결하면 되는거 아닐까?

 

라고 생각하다가 문득

 

 

왜 1, 2번 케이스만 자꾸 시간초과 뜨는거지? 봤더니

 

 

 

 

while 문 안에서 break 조건을 주지 않은 나를 탓해라 ....

 


 

def StringRemove(new_id) :
    for id in new_id :
        try :
            id = int(id)
        except :
            if (ord(id) >= 97 and ord(id) <= 122) or id in ['-', '_', '.'] :
                pass
            else :
                new_id = new_id.replace(id, '')
    return new_id

def FinalProcess(new_id) :
    if len(new_id) == 0 :
        new_id = 'a'
    elif len(new_id) >= 16 :
        new_id = new_id[:15]
        new_id = new_id.rstrip('.')
    if len(new_id) <= 2 :
        while (True) :
            if len(new_id) == 3 :
                break
            else :
                new_id += new_id[-1]
    return new_id

def CombineDot(new_id) :
    idx = [i for i, x in enumerate(new_id) if x == '.']
    i = 0
    while (i < len(idx)//2) :
        new_id = new_id.replace('..', '.')
        i += 1
    return new_id

def solution(new_id):
    id = new_id.lower()
    id = StringRemove(id)
    id = CombineDot(id)
    id = id.strip('.')
    id = FinalProcess(id)

    return id

 

 

역시 내 힘으로 푼 게 제일 짜릿해 >, <

 

 

3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.

 

이 조건보고 처음에는 그럼 점이 여러 개면 다 어떻게 처리하지? 했는데 

그냥 while 문 돌리면서 계속 replace('..', '.') 하면 되는 .. 간단한 것이었ㄷr...