(파이썬으로 코딩테스트 연습하기) Programmers > 2021 KAKAO BLIND RECRUITMENT > 신규 아이디 추천
https://programmers.co.kr/learn/courses/30/lessons/72410
Solution
import re
def solution2(new_id) :
# step1
new_id = new_id.lower()
# step2
new_id = re.sub(r"[^a-zA-Z0-9-_.]","",new_id)
# step3
new_id = ".".join([i for i in new_id.split(".") if i != ''])
# step4
if new_id.endswith(".") :
new_id = new_id[:-1]
return(new_id)
def solution(new_id):
new_id = solution2(new_id)
# step5, 6, 7
if len(new_id)==0 :
new_id = 'a'
if len(new_id)<=2 :
new_id = new_id+new_id[-1]*(3-len(new_id))
if len(new_id)>=16 :
new_id = new_id[:15]
return(solution2(new_id))
문자열 다루는 방법을 아는가에 대해 묻는 문제이다.
이 문제에서 중요한건 정규표현식과 문제에서 예5에 해당하는 "abcdefghijklmn.p" 와 같은 예시이다.
"abcdefghijklmn.p"는 step6에서 글자를 15자까지만 남기면 마지막에 "."이 남게된다.
즉, step6다음 다시 step4로 돌아가 마지막에 "."을 지워주어야한다.
따라서 글자수와 관련없는 step1~4를 solution2라는 function으로 하나로 묶고,
soultion2실행 -> step5, 6, 7 실행 -> 다시 solution2를 실행해주었다.
정규표현식은 "re"라는 모듈을 활용하면 된다.
다른 사람의 풀이
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
step6 이후에 step1~4를 모두 실행할 필요없이 step4만 실행하면 된다.
step3(new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.)은 "."을 기준으로 String을 split한 후 다시 합쳐주는 방법으로 풀 수도 있고, 정규표현식으로 풀 수도 있다.
정규표현식에서 '+'는 앞에오는 문자가 최소 1번이상 반복된다는 뜻이다.
step4(new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.)은 String.startwith(".")과 String.endwith(".")으로도 할 수 있지만, 정규표현식으로 '^[.]|[.]$' 로도 표현할 수 있다.
정규표현식에서 ^는 ^뒤에오는 문자로 시작한다는 뜻이고, $는 $앞에오는 문자로 끝난다는 뜻이다.
'코딩테스트 연습 > 프로그래머스' 카테고리의 다른 글
[Python - 프로그래머스] 2023 KAKAO BLIND RECRUITMENT > 개인정보 수집 유효기간 (0) | 2023.01.12 |
---|---|
[프로그래머스 - Python] 2020 KAKAO BLIND RECRUITMENT > 문자열 압축 (0) | 2022.03.17 |
[Python - 프로그래머스] 로또의 최고 순위와 최저 순위 (0) | 2022.03.16 |
[Python - 프로그래머스] 2022 KAKAO BLIND RECRUITMENT > 신고 결과 받기 (0) | 2022.03.16 |
[프로그래머스 - Python] 전화번호 목록 (0) | 2022.03.11 |