프로그래머스 코딩테스트 고득점 Kit의 문제입니다.
https://programmers.co.kr/learn/challenges?tab=algorithm_practice_kit
문제
https://programmers.co.kr/learn/courses/30/lessons/72410
내가 작성한 코드
# 1차 작성 ---------------
def solution(new_id):
tmp = []
# 1
for c in new_id:
if 'A' <= c <= 'Z':
c = chr(ord('a') + ord(c) - ord('A'))
tmp.append(c)
answer = tmp
tmp = []
# 2
for c in answer:
if 'a' <= c <= 'z' or '0' <= c <= '9' or c == '-' or c == '_' or c == '.':
tmp.append(c)
answer = tmp
tmp = []
# 3
for i in range(len(answer)):
if tmp and tmp[-1] == '.' and answer[i] == '.':
continue
tmp.append(answer[i])
answer = tmp
# 4
while answer and answer[0] == '.':
answer.pop(0)
while answer and answer[-1] == '.':
answer.pop()
# 5
if not answer:
answer.append('a')
# 6
answer = answer[:15]
while answer and answer[0] == '.':
answer.pop(0)
while answer and answer[-1] == '.':
answer.pop()
# 7
while answer and len(answer) <= 2:
answer.append(answer[-1])
return ''.join(answer)
# 2차 작성 ---------------
import re
def solution(new_id):
answer = new_id
# 1
answer = answer.lower()
# 2
answer = re.sub("[^a-z0-9-_.]", "", answer)
# 3
answer = re.sub("\.{2,}", ".", answer)
# 4
answer = list(answer)
while answer and answer[0] == '.':
answer.pop(0)
while answer and answer[-1] == '.':
answer.pop()
# 5
if not answer:
answer.append('a')
# 6
answer = answer[:15]
while answer and answer[0] == '.':
answer.pop(0)
while answer and answer[-1] == '.':
answer.pop()
# 7
while answer and len(answer) <= 2:
answer.append(answer[-1])
return ''.join(answer)
- 기억이 안난 게 많다
- lowercase라 썼는데 안되고
- lower()가 str을 return하는지 in-place인지 헷갈리고
- re.sub에 인자 위치가 헷갈리고
- 리스트 슬라이싱에서 [:16]이라고 해야 15번째까지 나오는걸로 헷갈렸다
다른 사람이 작성한 코드
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
- 모든 단계를 한줄로 작성함
- regex에서 {2,} == +
- regex에서 문장의 맨 앞은 ^ / 맨 뒤는 $
기억해야할 것
- lower()
- re.sub(exp, replace, target)
- regex를 좀 더 효율적으로 활용하면 좋겠다
'코딩테스트' 카테고리의 다른 글
[백준][문자열] AC (0) | 2021.08.10 |
---|---|
[백준][문자열] 전화번호 목록 (0) | 2021.08.10 |
[백준][문자열] 문자열 폭발 (0) | 2021.08.10 |
[프로그래머스][KAKAO_BLIND][2021] 광고 삽입 (0) | 2021.08.07 |
[프로그래머스][KAKAO_BLIND][2021] 메뉴 리뉴얼 (0) | 2021.08.07 |