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 예외처리
if iterable객체[i] == '.' and iterable객체[i+1] == '.':
와 같은 코드를 실행시키면(i값 1씩 증가), 필연적으로 index값이 iterable객체의 범위를 초과하는 index error가 발생하기 때문에 예외처리가 반드시 필요하다.except
절 내부에도 i값의 변화식을 입력해야 한다.리스트 객체의 요소를 pop()
, remove()
등으로 삭제하는 경우, 해당 객체의 길이가 줄어들고, 경우에 따라서 빈 리스트(list()
)가 될 수 있기 때문에, 주의해야 한다.
'문자열'.encode().isalpha()
: 문자열이 알파뱃이면 True 반환'문자열'.isdigit()
: 문자열이 숫자면 True 반환'구분자'.join(iterable객체)
: iterable객체의 요소들을 '구분자'로 구분하여 문자열 형태로 출력