일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- React ssr
- Next.js
- 스택
- Next/Image 캐싱
- 파이썬 코딩테스트
- Image 컴포넌트
- c++
- 자바스크립트 컴파일
- 자바스크립트
- 네이버 부스트캠프
- 비디오 스트리밍
- PubSub 패턴
- Server Side Rendering
- react
- 네이버 부캠
- 자바스크립트 객체
- 파이썬 웹크롤링
- React.js
- 자바 프로젝트
- 파이썬
- 브라우저 동작
- git checkout
- 씨쁠쁠
- 부스트캠프
- beautifulsoup
- 멘션 추천 기능
- 네이버 부스트캠프 멤버십
- 프로그래머스
- 웹크롤링
- 코딩테스트
- Today
- Total
코린이의 개발 일지
[파이썬 코딩테스트] 신규 아이디 추천 (2021 Kakao blind recruitment) 본문
오늘은 작년 카카오에서 출제 되었었던 코딩테스트 문제를 가지고 왔습니다.
이 포스팅에는 해당 문제에 대한 정답이 나와있으니 아직 안풀어 보신 분들은 아래 사이트 혹은 백준 사이트에 가서 문제를 풀어보고 오시길 바랍니다.
https://programmers.co.kr/learn/challenges
그럼 시작하겠습니다.
문제는 조금 복잡해 보여도 크게 어렵지는 않았는데요, 해결하는 목적뿐만 아니라 조금 간단하게 해결할 수 있는 방법을 생각하며 코드를 짜 보았습니다.
from string import ascii_lowercase
def solution(new_id):
possible=['.','-','_']
alphabet_list = list(ascii_lowercase)
number=list(map(str,range(10)))
answer = ""
# 1단계
answer=new_id.lower()
lst=list(answer)
ans_lst=[]
# 2단계, 3단계
for i in lst:
if i in possible:
if ans_lst:
if ans_lst[-1]=="." and i==".":
continue
ans_lst.append(i)
continue
elif i in alphabet_list:
ans_lst.append(i)
continue
elif i in number:
ans_lst.append(i)
continue
# 4단계
if ans_lst and ans_lst[0]=='.':
ans_lst.pop(0)
if ans_lst and ans_lst[-1]==".":
ans_lst.pop()
# 5단계
if not ans_lst:
ans_lst=["a"]
# 6단계
if len(ans_lst)>15:
ans_lst=ans_lst[:15]
if ans_lst[-1]==".":
ans_lst.pop()
# 7단계
if len(ans_lst)<3:
while len(ans_lst)!=3:
ans_lst.append(ans_lst[-1])
answer="".join(ans_lst)
return answer
간단하게 짜보려고 애를 써보았는데.. 아직 갈길이 멀었나 봅니다.
프로그래머스는 문제를 해결하면 다른 사람의 풀이를 볼 수 있는데요, 역시나 고수들의 풀이는 남다릅니다.
눈에 띄었던 점 몇개를 꼽아 보자면 우선
# 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
for c in new_id:
if c.isalpha() or c.isdigit() or c in ['-','_','.']:
answer += c
이 부분이었는데요, isalpha()와 isdigit() 메소드를 활용해서 아주 간단하게 알파벳과 숫자를 판별해 냈습니다.
나는 왜 이 함수를 몰랐던가
아쉬움이 많이 남지만 그래도 이제라도 알았으니 잘 활용해 보죠.
여기서 isalpha() 는 문자열 전체가 알파벳으로 구성되어 있으면 true를 리턴하고 그 외에는 false를 리턴 합니다.
주의할 점은 문자열에 숫자 및 공백이 포함되어 있으면 False를 리턴합니다.
isdigit()도 마찬가지 입니다. 숫자열이 숫자로만 구성되어 있을 경우 true를 리턴합니다.
주의할점은 isdigit은 '-'와 '.' 도 문자로 구분하기 때문에 소수점이나 음수를 판별할 수 없습니다.
또 흥미롭게 봤던 부분은
# 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
while '..' in answer:
answer = answer.replace('..', '.')
이 부분 이었습니다. 이게 3번째 부분인데 여기서 꽤 고민하신 분들이 많았을 겁니다.
저도 여기서 고민을 꽤 했는데, 이렇게 간단한 아이디어가 있었네요.
while문으로 반복을 해주니 "....."같이 점이 연속으로 나와도 해결 가능합니다.
아예 다른 방식의 접근으로 정규 표현식을 사용한 풀이가 있었는데, 엄청 간결합니다.
저는 아직 정규표현식에 대해 공부하지 않았는데 그 풀이를 보니 공부를 해봐야겠다는 생각이 들더군요.
주말 동안 정규 표현식 공부해서 관련 포스팅을 올려보도록 하겠습니다.
그럼 여러분 모두 즐코하세요!
'파이썬 코딩테스트 연습' 카테고리의 다른 글
[코딩테스트] - 2018 카카오 블라인드 : 뉴스 클러스터링 (0) | 2022.07.01 |
---|---|
[파이썬 코딩테스트] 스택, 이중 배열 간단하게 연습하기 좋은 코딩 문제 (0) | 2022.01.21 |
[파이썬 코딩테스트] 키패드 누르기 - 2020 카카오 인턴십 (0) | 2022.01.10 |
[파이썬 코테 문제] 로또의 최고 순위와 최저 순위 - 2021 (0) | 2022.01.09 |