📝 문제
> 신규 유저가 입력한 아이디를 나타내는 new_id가 매개변수로 주어질 때, "네오"가 설계한 7단계의 처리 과정을 거친 후의 추천 아이디를 return 하도록 solution 함수를 완성해 주세요.
https://programmers.co.kr/learn/courses/30/lessons/72410
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
🎨 풀이
💡 첫번째 시도 = 성공
- 이 문제는 말 그대로 사진 속 7단계를 통과하도록 new_id 변수를 수정하는 것이다.
import re
def solution(new_id):
answer = ''
new_id = new_id.lower() # 1단계
new_id = re.sub('[^a-z0-9-_.]', '',new_id) # 2단계
string = list(new_id) # 3단계
for i in range(1,len(string)):
if string[i] == '.':
if string[i-1] == '.':
string[i-1] = ''
new_id = "".join(string)
new_id = new_id.strip('.') # 4단계
if new_id == '': # 5단계
new_id = 'a'
if len(new_id) >= 16 : # 6단계
new_id = new_id[:15]
if new_id[14] == ".":
new_id = new_id[:14]
while len(new_id) < 3: # 7단계
new_id = new_id + new_id[-1]
answer = new_id
return answer
> 1단계 : 대문자를 모두 소문자로 치환
- lower() 함수 사용
2단계 : 소문자, 숫자, 빼기, 밑줄, 마침표 제외한 모든 문자 제거
- re.sub 사용! 저거 빼고 다 없애라~ 이거임.
* re.sub('패턴', '바꿀문자열', '문자열', 바꿀횟수)
=> new_id = re.sub('[^a-z0-9-_.]', '',new_id) : new_id에서 a-z, 0-9, '-'(빼기), '_' (밑줄), '.'(마침표) 를 제외한 (^ == not) 문자들을 ''로 바꾸는 것이다.
3단계 : 마침표가 2번 이상 연속된 부분을 하나로 치환
1. 문자열인 new_id를 list화 시킨 후 string에 저장. ex) string=['.','2','s','e','.','.'] // new_id = .2se..
2. for문을 이용해서 현재꺼가 마침표고 그 전꺼도 마침표면 그 전꺼를 없앰.
3. string에 있는 값을 new_id에 붙임.
4단계 : 마침표가 처음이나 끝에 위치하면 제거
* strip() : 인자로 전달된 문자를 String의 왼쪽과 오른쪽에서 제거합니다.
=> strip('.') 이용하면 맨 앞, 맨 뒤에 있는 마침표가 존재할 시 제거됨.
5단계 : 만약 빈 문자열이라면, a를 대입함.
- if문 이용, 비어있다면 new_id에 a 대입.
6단계 : 길이를 15자로 줄이고, 줄였을 때 마침표가 맨 끝에 위치하면 마침표도 제거.
* [:n] : ~n번째 문자까지 선택
- len와 [:15], if문 이용!
7단계 : 길이가 2자 이하라면 new_id의 마지막 문자를 길이가 3이 될 때까지 반복해서 붙임.
- ~까지 반복이라서 while 사용.
⭐ 느낀점
> 7단계 규칙이 명확해서 쉬울거라 생각했는데.. 쉽지 않았다. 함수 쓸 게 많고(어떻게 써야할지도 잘 모르겠고), 무엇보다 2단계와 3단계가 좀 많이 힘들었다. 2단계는 정규표현식 사용이 처음이라 어려웠고, 3단계는 무난할 줄 알았는데 그냥 힘들었다. 마침표가 여러개 있는 경우를 생각 못해서 힘들었던 것 같기도 하고,, 여튼 그렇다. 나의 부족함을 많이 깨달을 수 있었던 문제였다. 오히려 잘 된거지 뭐~
'🎲 알고리즘 공부 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / Level 1] 없는 숫자 더하기 (파이썬) (0) | 2022.04.01 |
---|---|
[프로그래머스 / Level 1] 숫자 문자열과 영단어 (파이썬) (0) | 2022.03.31 |
[프로그래머스 / Level 1] 로또의 최고 순위와 최저 순위 (파이썬) (0) | 2022.03.29 |
[프로그래머스 / Level 1] 직사각형 별찍기 (파이썬) (0) | 2022.03.28 |
[프로그래머스 / Level 1] x만큼 간격이 있는 n개의 숫자 (파이썬) (0) | 2022.03.27 |