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

Jin Lee·2022년 4월 29일
0

프로그래머스 Lv.1

목록 보기
32/32
post-thumbnail

문제 링크

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

Lv1.의 어려운 문제는 아니였지만 단계별로 잘 처리되었는지 프린트를 찍어 확인해 보았다.

1단계 조건인 대문자 -> 소문자 변환은 for 문을 돌리지 않고 string.lower() 메소드
를 사용해서 해결할 수 있다. 이 경우 원본문자열이 바뀌지 않기 때문에 다른 변수에 받아야 하고 string에서 사용 가능하기 때문에 내 코드처럼 리스트로 바꾼 다음 사용은 적합하지 않다.

2단계 조건과 같이 특정 문자를 제외하고 삭제가 필요한 경우 for문을 돌리면서 del이나 pop같이 길이에 영향을 주는 방법은 index out of range 에러를 유발할 수 있어 절대로 들어오지 않을 값으로 치환하고 반복문을 종료한 다음 일괄 필터해주는 방식으로 구현하였다.

3단계 조건의 경우 .이 연속될 경우 하나만 남겨야 하기 때문에 0번째 부터 문자열의 두번째 마지막 문자까지 검사하게 for문을 구성하였고 아래 그림처럼 작동한다.(예시로 세번째 까지만 그림)
노란 하이라이팅 : 현재 비교되는 대상
회색 네모칸 : 이전 루프결과가 반영됨

4단게 조건에서 하나의 for문으로 양쪽을 처리하려다가 실수가 있었는데 그렇게 구현하는 것보다 쪽 뒤쪽을 나누어 각각 다른 for문으로 처리하는게 가독성이 더 좋았다. 마침표가 처음이나 끝에 오리 않을 때가지 제거해야 하기 때문에 반복문으로 처리하였다.

5단계 문제에서 시키는 대로

6단계 문제에서 시키는 대로
.을 한번만 제거해도 되는 이유는 연속적인 .은 3단계 조건에서 제거되었고 끝을 잘랐기 때문에 4단계 조건에 위배될 수 있기 때문에 마지막 부분을 확인하여 . 제거 한번 시행한다.(문제 친절하네..)

7단계 문제에서 시키는 대로

def solution(new_id):
    new_id = list(new_id)
    
    for i in range(len(new_id)):
        if ord('A') <= ord(new_id[i]) <= ord('Z'):
            new_id[i] = chr(ord(new_id[i]) + 32)
    
    for i in range(len(new_id)):
        if ord('a') <= ord(new_id[i]) <= ord('z') or ord('0') <= ord(new_id[i]) <= ord('9') or new_id[i] == '-' or new_id[i] == '_' or new_id[i] == '.':
              continue
        else:
              new_id[i] = ''
              
    new_id = list(filter(None, new_id))
    
    for i in range(len(new_id) - 1):
        if new_id[i] == '.' and new_id[i + 1] == '.':
            new_id[i] = ''

    new_id = list(filter(None, new_id))
    
    for i in range(len(new_id)):
        if new_id[i] == '.':
            new_id[i] = ''
        else:
            break
            
    for i in range(len(new_id) - 1, -1, -1):
        if new_id[i] == '.':
            new_id[i] = ''
        else:
            break

    new_id = list(filter(None, new_id))
    
    if new_id == []:
        new_id.append('a')
    
    if len(new_id) >= 16:
        new_id = new_id[:15]
        if new_id[-1] == '.':
            new_id[-1] = ''
    
    while len(new_id) < 3:
        new_id.append(new_id[-1])
    
    answer = ''.join(new_id)
    
    return answer
profile
깃허브 : https://github.com/jinlee9270

0개의 댓글