2022.06.24.
프로그래머스 '신규 아이디 추천' 문제 피드백
1번째 시도: 성공
def solution(new_id):
# 1단계
answer = new_id.lower()
# 2단계
allowed = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '_', '.']
not_allowed = []
for i in set(answer):
if i not in allowed:
not_allowed.append(i)
for i in not_allowed:
answer = answer.replace(i, '')
# 3단계
check = 0
while (check == 0):
if '..' in answer:
answer = answer.replace('..', '.')
else:
check = 1
# 4단계
answer = answer.strip('.')
# 5단계
if answer == '':
answer = 'a'
# 6단계
answer = answer[0:15]
answer = answer.rstrip('.')
# 7단계
if len(answer) == 1:
answer = answer + answer + answer
if len(answer) == 2:
answer = answer + answer[-1:]
return answer
마침표 여러 개를 마침표 하나로 치환하는 것을 잘 고려해야 한다.
- answer.replace(x, y) : x를 y로 치환
Method | Description | Example |
strip( ) | 문자열 양 끝에 있는 공백을 모두 지움 | ' A '.strip( ) => A |
strip( 'x' ) | 문자열 양 끝에 있는 'x'를 모두 지움 | 'xxAxx'.strip( 'x' ) => A |
lstrip( 'x' ) | 문자열 왼쪽 끝에 있는 'x'를 모두 지움 | 'xxAxx'.lstrip( 'x' ) => Axx |
rstrip( 'x' ) | 문자열 오른쪽 끝에 있는 'x'를 모두 지움 | 'xxAxx'.rstrip( 'x' ) => xxA |
모범 답안 (1)
import re
def solution(new_id):
st = new_id
st = st.lower()
st = re.sub('[^a-z0-9\-_.]', '', st)
st = re.sub('\.+', '.', st)
st = re.sub('^[.]|[.]$', '', st)
st = 'a' if len(st) == 0 else st[:15]
st = re.sub('^[.]|[.]$', '', st)
st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
return st
다양한 정규식을 쓴 코드
그런데 실행 시간은 오히려 더 많이 나왔다.
모범 답안 (2)
# 2단계
answer = ''
for i in new_id:
if i.isalpha() or i.isdigit() or i in ['-', '_', '.']:
answer += i
# 3단계
while '..' in answer:
answer = answer.replace('..', '.')
2단계는 이 코드보다 내 코드의 실행 시간이 훨씬 더 짧다.
3단계는 이 코드가 더 간결하고 좋은 것 같다.
Method | Is every character ...? | Example |
isalpha( ) | alphabetic (A-Z, a-z) | |
isalnum( ) | alpha-numeric (A-Z, a-z, 0-9) | 'Apple3'.isalnum( ) => T 'an apple'.isalnum( ) => F |
isdigit( ) | numeric (0-9) | '2014'.isdigit( ) => T '9:30'.isdigit( ) => F |
isspace( ) | whitespace character (' ', '\n', '\t', '\r') | '\n \t \r \n'.isspace( ) => T 'a p p l e'.isspace( ) => F |
islower( ) | lowercase (a-z) | 'apple'.islower( ) => T 'Apple'.islower( ) => F |
isupper( ) | uppercase (A-Z) | 'APPLE'.isupper( ) => T 'Apple'.isupper( ) => F |
참고: https://sites.pitt.edu/~naraehan/python3/string_methods2.html
'코딩테스트' 카테고리의 다른 글
[코딩테스트, Python] 프로그래머스 '소수 만들기' 문제 피드백 (0) | 2022.06.25 |
---|---|
[코딩테스트, Python] 프로그래머스 '완주하지 못한 선수' 문제 피드백 (Feat. Hash Table) (0) | 2022.06.24 |
[코딩테스트, Python] 프로그래머스 '신고 결과 받기' 문제 피드백 (0) | 2022.06.23 |
[코딩테스트, Python] 백준알고리즘 6~10단계 문제 피드백 (0) | 2022.06.21 |
[코딩테스트 - Python] 백준알고리즘 1~5단계 문제 피드백 (0) | 2022.06.21 |