TIL - algorithm - 02

김영훈·2021년 3월 9일
0

# 신규 아이디 추천(Lv1)

  • 정답 코드
def solution(new_id):

    rec_id = []
    for i in range(len(new_id)):
        word = new_id[i].lower()

        if word in ['-', '_', '.'] or word.encode().isalpha() or word.isdigit():
            rec_id.append(word)
        
    i = 0
    while i < len(rec_id):
        try:
            if rec_id[i] == '.' and rec_id[i+1] == '.':       # 개인적으로 고민이 많았던 부분 : 연속된 문자열 하나로 줄이기
                rec_id[i:i+2] = ['.']                         # whie에서 index=0으로 초기화 시키는 것이 필요
                i = 0                                         # 필연적으로 발생하는 indexerror에 대한 예외 처리 필요       
            else:
                i += 1
        except IndexError:
            i += 1                  # 문제 발생 지점 : 변화식 처리하지 않음

    if rec_id != []:                # 문제 발생 지점 : 값이 존재할 때와 존재할 때를 나눠서 처리하지 않음

        if rec_id[0] == '.':
            rec_id.pop(0)

        if rec_id != []:            # 문제 발생 지점 : 바로 위 if문에 의해 빈 리스트가 생성될 수 있기 때문에 다시 한 번 흐름 처리 필요
            if rec_id[-1] == '.':
                rec_id.pop()
        else:                       # 문제 발생 지점 : 값이 존재하지 않는 경우에 대한 흐름 처리 필요
            rec_id.append('a')

    else:
        rec_id.append('a')

    if len(rec_id) >= 16:
        rec_id[15:] = []

        if rec_id[-1] == '.':
            rec_id.pop()   

    if len(rec_id) <= 2:
        
        while len(rec_id) < 3:
            rec_id.append(rec_id[-1])

    answer = ''.join(rec_id)

    return answer

print(solution("z-+.^."))

  • 문제점

    • 연속된 문자열을 하나의 문자열로 줄일 때 고려해야하는 점: 1. 인덱스 초기화 2. index error 예외처리

      • 인덱스 초기화: 연속된 문자열이 세 개 일 때 인덱스를 0으로 초기화하지 않으면, 연속된 문자열이 하나가 아닌 두 개로 남게 된다.
      • index error 예외처리: if iterable객체[i] == '.' and iterable객체[i+1] == '.':와 같은 코드를 실행시키면(i값 1씩 증가), 필연적으로 index값이 iterable객체의 범위를 초과하는 index error가 발생하기 때문에 예외처리가 반드시 필요하다.
      • 예외처리 except절 내부에도 i값의 변화식을 입력해야 한다.
    • 리스트 객체의 요소를 pop(), remove() 등으로 삭제하는 경우, 해당 객체의 길이가 줄어들고, 경우에 따라서 빈 리스트(list())가 될 수 있기 때문에, 주의해야 한다.

# review

  • '문자열'.encode().isalpha(): 문자열이 알파뱃이면 True 반환
  • '문자열'.isdigit(): 문자열이 숫자면 True 반환
  • '구분자'.join(iterable객체): iterable객체의 요소들을 '구분자'로 구분하여 문자열 형태출력
profile
Difference & Repetition

0개의 댓글