티스토리 뷰
728x90
반응형
https://programmers.co.kr/learn/courses/30/lessons/72410
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
<나의 풀이>
def solution(new_id):
answer = []
# 2단계를 위해 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 추가한 리스트 생성
check = [str(i) for i in range(0, 10)] + [chr(i)
for i in range(97, 123)] + ['-', '_', '.']
# 1 : 모든 대문자를 대응되는 소문자로 치환
new_id = list(new_id.lower())
# 2 : 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)이면 추가
for i in new_id:
if i in check:
answer.append(i)
# 3 : 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환
# 연속으로 나왔을 경우 앞에 있는 마침표를 공백으로 바꿔준 후 제거함
for i in range(len(answer)-1):
if (answer[i] == '.') and (answer[i+1] == '.'):
answer[i] = ' '
answer = "".join(answer).replace(' ', '')
# 4 : 마침표(.)가 처음이나 끝에 위치하면 슬라이싱을 이용해 제거
if (len(answer) >= 1):
if (answer[0] == '.'):
answer = answer[1:]
if (len(answer) >= 1):
if (answer[-1] == '.'):
answer = answer[:-1]
# 5 : 빈 문자열이라면, new_id에 "a"를 대입
if len(answer) < 1:
answer += 'a'
# 6 : 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거
if len(answer) >= 16:
answer = answer[:15]
# 7 : 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙임
elif len(answer) <= 2:
while(len(answer) < 3):
answer += answer[-1]
# 단계를 마친 후에 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거
if (answer[-1] == '.'):
answer = answer[:-1]
return answer
3단계에서 애먹은 문제ㅠㅠㅠ
다른 사람의 풀이를 보니 생각보다 단순해서 또 한번 깨달음을 얻었다!
<다른 사람의 풀이>
def solution(new_id):
answer = ''
# 1
new_id = new_id.lower()
# 2
for c in new_id:
if c.isalpha() or c.isdigit() or c in ['-', '_', '.']:
answer += c
# 3
while '..' in answer:
answer = answer.replace('..', '.')
# 4
if answer[0] == '.':
answer = answer[1:] if len(answer) > 1 else '.'
if answer[-1] == '.':
answer = answer[:-1]
# 5
if answer == '':
answer = 'a'
# 6
if len(answer) > 15:
answer = answer[:15]
if answer[-1] == '.':
answer = answer[:-1]
# 7
while len(answer) < 3:
answer += answer[-1]
return answer
# <배운점>
# => 3단계 부분에서 '..'으로 연속된 마침표의 점을 찾는 점
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
# <배운점>
# => 역시 정규표현식이 최고라는 점... 코드도 간결하고 시간도 훨씬 절약할 수 있더라ㅠㅠㅠ
728x90
반응형
'[그 외] > ㄴ (코테연습 : 파이썬 ver)' 카테고리의 다른 글
[프로그래머스] N개의 최소공배수 (파이썬) (0) | 2021.06.28 |
---|---|
[프로그래머스] 모의고사 (파이썬) (0) | 2021.06.25 |
[프로그래머스] 로또의 최고 순위와 최저 순위 (파이썬) (0) | 2021.06.25 |
[프로그래머스] 완주하지 못한 선수 (파이썬) (0) | 2021.06.25 |
[프로그래머스] 음양 더하기 (파이썬) (0) | 2021.06.23 |
댓글
250x250
반응형
TAG
- 문법
- 컴퓨터개론
- 피보나치
- 조합
- 알고리즘
- 월간 코드 챌린지 시즌2
- 이진탐색
- 월간 코드 챌린지 시즌1
- level1
- GIT
- 프로그래머스문제
- 유닉스커맨드
- x만큼간격이있는n개의숫자
- 백준
- KAKAO
- 정렬
- 파이썬문법
- 프로그래머스
- 코딩테스트
- 프로그래머스코딩테스트
- SWiFT
- Summer/Winter Coding(~2018)
- level2
- 코드잇
- 재귀함수
- 프로그래밍언어
- 알고리즘문제
- 파이썬
- 프로그래머스 프로그래머스문제
- 설치
최근에 달린 댓글
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
링크
- Total
- Today
- Yesterday