https://school.programmers.co.kr/learn/courses/30/lessons/72410
'''
아
시뮬레이션
중복된 거 set 으로 없앨 수 있음 -> 근데 순서가 다 섞임
array.remove(a) 는 첫번째 a를 지움
양끝 . 은 strip 으로 제거할 수 있음
시
자
'''
def solution(new_id):
answer = ''
spc = ['~','!','@','#','$','%','^','&','*','(',')','=','+','[','{',']','}',':','?',',','<','>','/']
new_id = list(new_id.lower())
i = 0
while i < len(new_id):
if new_id[i] in spc:
new_id.remove(new_id[i])
i -= 1
i += 1
st_3_id = []
chk = False
for i in range(len(new_id)):
if new_id[i] == '.':
if chk == True:
continue
chk = True
st_3_id.append(new_id[i])
else:
chk = False
st_3_id.append(new_id[i])
new_id = st_3_id
new_id = ''.join(new_id).strip('.')
if new_id == '':
new_id = 'a'
if len(new_id) >= 16:
new_id = new_id[0:15]
new_id = new_id.strip('.')
while len(new_id) < 3:
new_id = new_id + new_id[-1]
return new_id
단순 문자 시뮬레이션 문제
그냥 단순 시뮬레이션 문제
문제 주어진 조건 그대로 구현
def solution(new_id):
forbidden = '~!@#$%^&*()=+[{]}:?,<>/'
answer = ''
#step1
answer = new_id.lower()
#print("step1:",answer)
#step2
tmp = ""
pointer = 0
while pointer < len(answer):
if answer[pointer] not in forbidden:
tmp += answer[pointer]
pointer += 1
answer = tmp
#print("step2:",answer)
#step3
tmp = ""
pointer = 0
while pointer < len(answer):
if answer[pointer] == '.':
while pointer+1 < len(answer) and answer[pointer+1] == '.':
pointer += 1
tmp += answer[pointer]
pointer += 1
answer = tmp
#print("step3:",answer)
#step4
answer = answer.strip('.')
#print("step4:",answer)
#step5
if len(answer) == 0:
answer = "a"
#print("step5:",answer)
#step6
if len(answer) >= 16:
answer = answer[:15]
if answer[-1] == '.':
answer = answer[:14]
#print("step6:",answer)
#step7
if len(answer) <= 2:
while len(answer) <= 2:
answer += answer[-1]
#print("step7:",answer)
return answer
새롭게 알게된 내장함수
str.isalpha() → 알파벳인지 판별
str.isdigit() → 숫자인지 판별
str.rstrip([chars]) → 오른쪽에서부터 strip
str.lstrip([chars]) → 왼쪽에서부터 strip
import re
# 1-Line Challenge
def solution(new_id):
return re.sub('\.{2,}', '.', re.sub('[^a-z0-9-_.]', '', new_id.lower())).strip('.')[:15].rstrip('.') + re.sub('\.{2,}', '.', re.sub('[^a-z0-9-_.]', '', new_id.lower())).strip('.')[:15].rstrip('.')[-1]*(3-min(3, len(re.sub('\.{2,}', '.', re.sub('[^a-z0-9-_.]', '', new_id.lower())).strip('.')[:15].rstrip('.')))) if re.sub('\.{2,}', '.', re.sub('[^a-z0-9-_.]', '', new_id.lower())).strip('.')[:15].rstrip('.') else 'aaa'
def solution(new_id):
#✅ 주어진 문자열의 모든 대문자를 대응되는 소문자로 치환한다.
step1 = new_id.lower()
#✅ 주어진 문자열에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거한다.
step2 = re.sub('[^a-z0-9-_.]', '', step1)
#✅ 주어진 문자열에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환한다.
step3 = re.sub('\.{2,}', '.', step2)
#✅ 주어진 문자열에서 처음과 끝에 위치한 마침표(.)를 제거한다.
step4 = step3.strip('.')
#✅ 주어진 문자열이 빈 문자열이라면, "a"를 대입한다.
step5 = step4 if step4 else "a"
#✅ 주어진 문자열의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거한다.
#✅ 제거 후 마침표(.)가 문자열의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거한다.
step6 = step5[:15].rstrip('.')
#✅ 주어진 문자열의 길이가 2자 이하라면, 마지막 문자를 문자열의 길이가 3이 될 때까지 반복해서 끝에 붙인다.
step7 = step6[:]
while len(step7) < 3:
step7 += step6[-1]
return step7
정규 표현식이란 프로그래밍에서 문자열을 다룰 때 문자열의 패턴을 표현하는 언어이다. 파이썬의 경우 정규 표현식을 사용하기 위해 별도의 라이브러리(re)를 import 해야 한다.
기본적인 사용법은 다음과 같다.
[abc] # a, b, c 중 한 문자
[abc123] # a, b, c, 1, 2, 3 중 한 문자
[a-z] # a~z 중 한 문자
[1-5] # 1~5 중 한 문자
[a-zA-Z0-9] # 모든 알파벳, 숫자
[^0-9] # 숫자가 아닌 모든 문자
a.c # a + 임의의 문자 + c // abc, acc는 해당되지만 a\nc는 해당되지 않는다.
a[.]c # a.c
a*c # c, ac, aac, aaac, aaaac ....
a+c # ac, aac, aaac, aaaac ....
a?c # c, ac
a{3}c # aaac
a{1,3}c # ac, aac, aaac
a{0,1}c # c, ac == a?c
a{0, }c # c, ac, aac ... == a*c
a{1, }c # ac, aac ... == a+c
a{ ,3}c # c, ac, aac, aaac
댓글로 또는 이곳에 질문 남겨주세요.