문제링크
나의 풀이
def solution(new_id):
new_id = change(new_id)
new_id = deleteChar(new_id)
new_id = deleteDot(new_id)
new_id = lengthCtrl(new_id)
result = deleteDot(new_id)
result = ''.join(result)
return result
def change(id):
id = id.lower()
return id
def deleteChar(id):
id = list(id)
i = 0
while (i < len(id)):
if 97 <= ord(id[i]) <= 122 or ord(id[i]) == 46 or ord(id[i]) == 55 or ord(id[i]) == 137 or 48 <= ord(id[i]) <= 57 or ord(id[i]) == 95 or ord(id[i]) == 45:
i += 1
else:
id.pop(i)
return id
def deleteDot(id):
i = 0
while (i < len(id)):
if i == 0:
if id[i] == '.':
id.pop(0)
continue
if i == len(id) - 1:
if id[i] == '.':
id.pop(i)
continue
if id[i] == '.':
if i + 1 < len(id):
if id[i + 1] == '.':
id.pop(i + 1)
else:
i += 1
else:
i += 1
return id
def lengthCtrl(id):
if len(id) == 0:
return 'aaa'
elif len(id) >= 16:
tmp = id[:15]
return tmp
elif len(id) <= 2:
tmp = id.pop()
while len(id) < 3:
id.append(tmp)
return id
else:
return id
- 조건이 많은 문제였는데 조건을 전부 파악하지 않고 일단 코드를 짠 후, 디버깅을 하며 조건을 추가해서 시간이 오래걸렸다.
- 함수명이나 변수명을 고려하는데 시간이 꽤 걸렸다.
다른 풀이
def solution(new_id):
answer = ''
new_id = new_id.lower()
for c in new_id:
if c.isalpha() or c.isdigit() or c in ['-', '_', '.']:
answer += c
while '..' in answer:
answer = answer.replace('..', '.')
if answer[0] == '.':
answer = answer[1:] if len(answer) > 1 else '.'
if answer[-1] == '.':
answer = answer[:-1]
if answer == '':
answer = 'a'
if len(answer) > 15:
answer = answer[:15]
if answer[-1] == '.':
answer = answer[:-1]
while len(answer) < 3:
answer += answer[-1]
return answer
- 목적에 따라 함수를 분리하지 말고, 주석을 활용하자.
- 인덱스 -1을 잘 활용하자.
- python의 string api들에 익숙해질 필요가 있다.