일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바
- 코딩테스트
- 기초100제
- 응용
- SELECT 절
- 단계별로 풀어보기
- GROUP BY 절
- Codeup
- 기본
- programmers
- Codeforces Round #802 (Div. 2)
- BOJ
- Python
- 명품 자바 프로그래밍
- SQLD / SQLP
- Python 3
- baekjoon
- 공공데이터
- 이론
- Java11
- pypy3
- 파이썬
- 헤드퍼스트 디자인패턴
- 개념
- JAVA 11
- 백준
- level1
- HAVING 절
- java
- 기초
- Today
- Total
Development Project
[ Programmers - 06/25 ] - 신규 아이디 추천(Python)_Level1 본문
[ Programmers - 06/25 ] - 신규 아이디 추천(Python)_Level1
나를 위한 시간 2022. 6. 26. 00:30- 문제링크
https://programmers.co.kr/learn/courses/30/lessons/72410?language=python3
코딩테스트 연습 - 신규 아이디 추천
카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로
programmers.co.kr
- 문제



- 시행착오
문제를 봤을때 하나하나 순서를 알려줘서 이 문제는 틀리는 사람이 거의 없겠다고 생각했었는데, 각 단계별 지시사항을 보고 이걸 해주는 함수가 있었는데 이름이 잘 기억나지 않았다. 거기다 한번도 써본적 없는 함수도 있었기에 생각보다 오래 걸렸던 문제였다.
- 문제분석
new_id : 사용자가 입력한 아이디
를 입력받아 1~7단계에 걸쳐 유효한 사용자의 아이디와 비슷하지만 유효한 아이디로 변경하여 추천해주는 것이다.
문제에서 설명을 다 하나씩 해주기 때문에 순서대로 따라 코딩하면 된다.
- 각 파라미터의 유형
new_id = "...!@BaT#*..y.abcdefghijklm"
<조건>
→ 1 ≤ new_id의 길이 ≤ 1,000
→ new_id는 알파벳 대문자, 소문자, 숫자, 특수문자로 구성됨 ※ 특수문자 : -_.~!@#$%^&*()=+[{]}:?,<>/ 로 한정
=> 아이디를 나타내는 문자열이며, 위의 조건을 충족한다.
- 문제접근
※ 작성자가 문제를 보고 든 생각을 차례대로 써본 것이다. 이 순번은 정답이 아니며 매번 다른 생각을 해보길 권장한다.
=> 사실 이 문제는 단계가 주어져있으므로 그대로 따라가며 코딩해보았다.
1) new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
=> lower()함수로 소문자로 바꿀 수 있다. 반복문을 돌면서 한글자가 아스키코드로 대문자에 속하면 소문자로 바꾸는 식으로 구현은 할 수 있지만, lower() 함수가 더 간단하고 복잡하지 않아 그대로 쓰기로 했다.
2) new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
=> replace를 생각했지만, 제외한 모든 문자라서 코드만 엄청 길어질 것 같아 다른 방법을 생각하기로 했다. 현재 문자가 영어나 한글 숫자일 경우에만 참을 반환하는 isalnum() 함수를 통해 1차적으로 특수문자 인지 아닌지를 구분해서, 영어 한글 숫자이거나 특수문자 -_.인 경우에만 문자열에 추가한다.
3) new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
==> 이 부분도 단순 replace를 생각했지만 replace("..",".")로만 사용하기에는 점이 3개이상 연속될 경우에는 점 한개만으로 치환되지 않기때문에, in 명령어 (안에 포함되어있는지를 true, false로 판단해줌)을 이용해 점 두개가 연속된게 문자열에 포함되어 있다면 이를 한개로 바꾸는 작업을 반복하게 하는것이 효율적이라 생각했다.
4) new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
==> 간단히 조건문을 이용해 마침표가 처음[0번째]이나 끝[-1번째]에 위치하는지 판단하고, 존재하면 슬라이싱을 이용해 제거할 수 있다.
5) new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
==> 빈 문자열을 판단하는 방법은 문자열=' ' 이거나 문자열의 길이가 0일때 이므로, 이를 이용해 대입하면 된다.
6) new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
==> 요구사항 그대로 15자까지만 슬라이싱을 한 뒤, 마지막 글자가 마침표라면 하나줄여서 슬라이싱을 해준다.
7) new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
==> 문자 혹은 문자열을 반복해서 뒤에 붙이는 방법은 *연산자를 사용하면 된다.
- 최종코드
def solution(new_id):
answer = ''
for word in new_id.lower():
if word.isalnum() or word in '-_.':
answer += word
while '..' in answer:
answer = answer.replace('..', '.')
answer = answer[1:] if answer[0] == '.' and len(answer) > 1 else answer
answer = answer[:-1] if answer[-1] == '.' else answer
answer = 'a' if answer == '' else answer
if len(answer) >= 16:
answer = answer[:15]
if answer[-1] == '.':
answer = answer[:-1]
if len(answer) <= 3:
answer = answer + answer[-1] * (3-len(answer))
return answer
'CodingTest > Programmers' 카테고리의 다른 글
[ Programmers - 06/26 ] - 숫자 문자열과 영단어(Python)_Level1 (0) | 2022.06.26 |
---|---|
[ Programmers - 06/24 ] - 로또의 최고 순위와 최저 순위(Python)_Level1 (0) | 2022.06.24 |
[ Programmers - 06/24 ] - 신고결과받기(Python)_Level1 (0) | 2022.06.24 |