🤔 나의 풀이
📌 문제
- programmers > 2021 KAKAO BLIND RECRUITMENT > 신규 아이디 추천
📌 날짜
2021.06.23
📌 시도 횟수
1 try
💡 Code
def solution(new_id):
answer = level7(level6(level5(level4(level3(level2(level1(new_id)))))))
return answer
def level1(new_id):
return new_id.lower()
def level2(new_id):
changed = ""
for letter in new_id:
if letter not in "~!@#$%^&*()=+[{]}:?,<>/":
changed += letter
return changed
def level3(new_id):
idx, dots = 0, 0
changed = ""
while new_id and idx < len(new_id):
if new_id[idx] == ".":
dots += 1
if idx == len(new_id) - 1:
changed += new_id[idx]
else:
if dots >= 1:
changed += "."
dots = 0
changed += new_id[idx]
idx += 1
return changed
if idx >= 2:
return "." + new_id[idx:]
return new_id
def level4(new_id):
if new_id:
if new_id[0] == ".":
new_id = new_id[1:]
if new_id:
if new_id[-1] == ".":
new_id = new_id[:-1]
return new_id
def level5(new_id):
if not new_id:
return "a"
return new_id
def level6(new_id):
if len(new_id) >= 15:
new_id = new_id[:15]
if new_id[-1] == ".":
return new_id[:-1]
return new_id
def level7(new_id):
letter = new_id[-1]
while len(new_id) < 3:
new_id += letter
return new_id
💡 문제 해결 방법
💡 새롭게 알게 된 점
- 너무 길고 복잡하다. 간략화 시킬 필요가 있다.
❌ (한번에 맞추지 못한 경우) 오답의 원인
📌 1차 개선
💡 문제 해결 방법
- Level3을 개선해보았다. 방법은 2가지를 사용했다.
- (1) while문을 통해 1번 반복할때마다 ".."를 "."로 치환한다.
따라서 모든 ".."가 사라질때까지 반복하면, 최종적으로 "."만 남게 된다.
- (2) for문을 통해 한 글자씩 새로운 문자열로 옮긴다.
단, 새롭게 옮긴 문자열의 맨 끝이 "."인 경우에
현재 문자를 검사했을때 똑같이 "."이라면 옮기지 않고 pass한다.
💡Code : 방법 1
def level3(new_id):
while ".." in new_id:
new_id = new_id.replace("..", ".")
return new_id
💡Code : 방법 2
def level3(new_id):
changed = new_id[0]
for letter in new_id[1:]:
if changed[-1] == "." and letter == ".":
pass
else:
changed += letter
return changed
📌 2차 개선 : 정규식의 사용
💡 문제 해결 방법
- 정규식을 이용하면 정말 깔끔하게 풀 수 있다.
- re.sub('패턴', '바꿀문자열', '문자열', 바꿀횟수) => 이것도 기억하자.
💡Code
import re
def solution(new_id):
answer = new_id
answer = answer.lower()
answer = re.sub("[^a-z0-9\-\_\.]", "", answer)
answer = re.sub("\.+", ".", answer)
answer = re.sub("^[.]|[.]$", "", answer)
if not answer:
answer = "a"
if len(answer) > 15:
answer = answer[:15]
if answer[-1] == ".":
answer = answer[:-1]
if len(answer) <= 2:
answer += answer[-1] * (3 - len(answer))
return answer
✨정규식 간단하게 정리하기
정규식 표현 | 뜻 |
---|
\| | 또는 |
() | 그룹 |
[] | 괄호안의 어떤 문자든지 |
[^] | 괄호안의 어떤 문자가 아니다 |
(?:) | 찾지만 기억하지는 않음 |
? | 0 또는 1 |
* | 0개 이상 |
+ | 1개 이상 |
{n} | n번 반복 |
{min,} , {min,max} | 최소, 최소 ~ 최대 |
\b | 단어 경계 |
\B | 단어 경계가 아님 |
^ | 문장의 시작 |
$ | 문장의 끝 |
. | 어떤 글자 (줄바꿈 문자 제외) |
\d | digit 숫자 |
\D | digit 숫자 아님 |
\w | word 문자 |
\W | word 문자 아님 |
\s | space 공백 |
\S | space 공백 아님 |
출처 - 드림코딩 : 정규식 Youtube 강의