https://programmers.co.kr/learn/courses/30/lessons/72410
다음 문제는, 입력된 값을 주어진 조건에 따라 결과를 출력하는 문제입니다.
- lower() 이용
- 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.) 인 경우 append를 이용해 문자를 추가 && append를 이용하면 리스트 형태로 되기 때문에 추가된 문자열을 join을 이용해 합쳐주기
- replace를 이용해 점(.)이 두개인 것들을 한개로 치환해주기
- 다른 방법을 생각해봤는데 도무지 안돼서 맨앞 또는 맨뒤에 있는 경우 슬라이싱을 이용해 문자열을 잘라주기
- 말그대로 빈 문자열이라면 a를 넣어주고 아니면 패쓰~
- 문자열 길이가 16 이상인경우, 15자까지만 슬라이싱 이용 및 마지막 문자가 점(.)이라면 제거
- 입력된 문자열의 길이가 2자 이하라면, 마지막 문자를 이용해 3이 될때까지 슬라이싱을 이용해 이어붙이기
def solution(new_id):
answer = []
new_id = new_id.lower() # 1번 조건
for i in range(len(new_id)): # 2번 조건
if new_id[i].isalpha():
answer.append(new_id[i])
elif new_id[i].isalnum():
answer.append(new_id[i])
elif new_id[i] == '-':
answer.append(new_id[i])
elif new_id[i] == '_':
answer.append(new_id[i])
elif new_id[i] == '.':
answer.append(new_id[i])
answer = "".join(answer)
for i in range(len(answer)): # 3번 조건
answer = answer.replace("..", ".")
while answer: # 4번 조건
if answer[0] == '.':
answer = answer[1:]
elif answer[-1] == '.':
answer = answer[:-1]
else:
break
if answer == "": # 5번 조건
answer = "a"
if (len(answer) >= 16): # 6번 조건
answer = answer[:15]
if answer[-1] == ".":
answer = answer[:14]
if (len(answer) <= 2): # 7번 조건
while len(answer) < 3:
answer += answer[-1]
return answer
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
★★★★★ 제일 중요한 부분: replace 하게 되면 반환값을 꼭 저장 해줘야합니다. 그렇지 않으면 값이 바뀌지 않습니다.
Prototype: replace(old, new, [count]) -> replace("찾을값", "바꿀값", [바꿀횟수])
text = '123,456,789,999'
replaceAll= text.replace(",","")
replace_t1 = text.replace(",", "",1)
replace_t2 = text.replace(",", "",2)
replace_t3 = text.replace(",", "",3)
print("결과 :")
print(replaceAll)
print(replace_t1)
print(replace_t2)
print(replace_t3)
'''
결과 :
123456789999
123456,789,999
123456789,999
123456789999
'''
다른 사람 코드에서 정규 표현식을 이용해 이 문제를 너무나도 간단히 해결했다. 그래서 정규 표현식이란 무엇인지 한번 공부해보려 한다.
📝 메타 문자란 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용되는 문자를 말한다. 정규 표현식에서 사용하는 메타 문자에는 다음과 같은 것이 있다.
. ^ $ * + ? { } [ ] \ | ( )
[0-9] 또는 [a-zA-Z] 등은 무척 자주 사용하는 정규 표현식이다. 이렇게 자주 사용하는 정규식은 별도의 표기법으로 표현할 수 있다. 다음을 기억해 두자.
🔔 대문자로 사용된 것은 소문자의 반대임을 추측할 수 있다. 🔔
ca*t
이 정규식에는 반복을 의미하는 메타 문자가 사용되었다. 여기에서 사용한 은 *바로 앞에 있는 문자 a가 0부터 무한대로 반복될 수 있다는 의미입니다.
정규식 | 문자열 | Match 여부 | 설명 |
---|---|---|---|
ca*t | ct | Yes | "a"가 0번 반복되어 매치 |
ca*t | cat | Yes | "a"가 0번 이상 반복되어 매치 (1번 반복) |
ca*t | caaat | Yes | "a"가 0번 이상 반복되어 매치 (3번 반복) |
ca+t
반복을 나타내는 또 다른 메타 문자로 +가 있다. +는 최소 1번 이상 반복될 때 사용한다. 즉 *가 반복 횟수 0부터라면 +는 반복 횟수 1부터인 것이다.
정규식 | 문자열 | Match 여부 | 설명 |
---|---|---|---|
ca+t | ct | No | "a"가 0번 반복되어 매치되지 않음 |
ca+t | cat | Yes | "a"가 1번 이상 반복되어 매치 (1번 반복) |
ca+t | caaat | Yes | "a"가 1번 이상 반복되어 매치 (3번 반복) |
📝 파이썬은 정규 표현식을 지원하기 위해 re(regular expression의 약어) 모듈을 제공한다. re 모듈은 파이썬을 설치할 때 자동으로 설치되는 기본 라이브러리로 사용 방법은 다음과 같다.
>>> import re
>>> p = re.compile('ab*')