너와!나의!알고!리즘!/PROGRAMMERS

[2021 KAKAO , Python] 신규아이디추천

moongchi98 2021. 4. 7. 22:29

매번 백준만 풀다가 뭔가 실제 코테를 풀어보고 싶어서..도전해봤다 사실 합승택시요금?을 당차게 도전했다가 도저히,,안되서 봤더니 다익스트라..인가..머시기..아직 안배운 내용이여서 깔꼼하게 포기했다  (ʃƪ˘・ᴗ・˘)  난 포기가 쉬운 사람..

처음에 이문제를 봤을 때는 와 저 단계를 다처리하면 시간 초과가 발생하지 않을까..? 라는 막연한 두려움이 있었는데 그냥 해야한다.. 묻지마... moot G Ma...

1번은 간단하게 lower함수를 사용해서 소문자로 바꿔준다. 앗 new_id를 왜 굳이 list로 바꿔주냐면,,사실,,, 처음에는 list에서 조작을 하려고 했는데 원본을 손상시키면 아래서 계속 꼬여서 그냥 arr라는 새로운 문자열에 조건에 부합하는 값들을 넣어주는 방식으로 풀어나갔다. 즉 list로 변형할 필요는 전-혀 없다는 의미 ^,^ 지우는 거 까먹음

2번 조건은 아스키코드 값으로 소문자, 숫자인지 확인했고 특수문자애들은 하나하나 비교했다.

3번은 구글링의 힘을 빌렸는데 `while`문을 사용하면 ..이 아무리 중복되어도 한개로 계속 대치되면서, 알아서 조건에 맞게 변형해간다. 문자열이 편한이유는 replace를 사용할 수 있기때문에, 문자열로 계속 진행하는걸 추천한다.

그 다음에, 테스트 케이스에서 계속 2-3개 정도 틀렸는데 그건 4번에서 맨 앞과 맨 뒤가 '.'인 애들을 if -elif 로 분기처리해주면서 앞이 '.'이 첫 if문에서 걸러지면, 맨 뒤가 .이여도 처리가 안되는 문제였다. 이걸 고쳐도, 런타임 에러가 발생했는데 역시 4번에서 문자열 길이가 0이어버릴때, index에러가 발생하는 거였다. 

이걸 해결해주고, 나머지는 와 문자열을 다 짤라야하나.. 했는데,, pop을 쓰는것보다 제일 좋은건 slicing으로 짤라주는게 진짜 효율적인 것 같다~!~

def solution(new_id):
    #1번
    new_id = list(map(str,new_id.lower()))
    arr= ""
    #2번
    for i in range(len(new_id)):
        if 48<=ord(new_id[i])<=57 or 97<=ord(new_id[i])<=122:
            arr += (new_id[i])
        else:
            if new_id[i] != '-' and new_id[i] != '_' and new_id[i] != '.':
                continue
            else:
                arr += new_id[i]
    #3번
    while '..' in arr:
        arr = arr.replace('..','.')
    #4번 => slicing으로 접근
    if len(arr) > 1:
        if arr[0] == '.':
            arr = arr[1:]
        if arr[-1] == '.':
            arr = arr[:-1]
    elif len(arr) == 1 and arr[0] == '.':
        arr = ""

    #5번
    if len(arr) == 0:
        arr += "a"
    #6번
    if len(arr) >= 16:
        arr = arr[:15]
        if arr[14] == '.':
            arr = arr[:14]
    #7번
    if len(arr) <=2:
        while len(arr) < 3:
            arr += arr[-1]
            if len(arr) == 3:
                break
    return arr