ps 거의 한 달만인가요 허허 토요일에 코딩테스트가 있어서 급하게 벼락치기로 준비해봅니다. 합격하면 좋고 합격을 못하더라도 예전보다만 제발 잘 봤으면 좋겠습니다.
어쨋든 오늘 풀 문제는 2021년 카카오 공채 코딩테스트 1번 문제였던 신규 아이디 추천 문제입니다.
programmers.co.kr/learn/courses/30/lessons/72410
문제 접근
1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다. 만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
이 문제는 1단계부터 7단계까지의 요구사항을 그대로 구현하면 되는 문제였습니다.
저는 그동안 이런 유형의 문제를 한 3번정도 봤고, 그때마다 매번 같은 실수로 시간을 낭비해서 다시는 그러지 않으리 다짐하는 차원의 포스팅이 되겠습니다.
포지션 정하기
정확히는 스탠스라고 표현하나요?? 정규표현식을 이용해서 문제를 풀어나갈 것인지, 아니면 단순히 if문으로 풀지 이걸 정해야합니다. 저는 매번 정규표현식으로 풀 수 있어보여서 도전했다가 1시간동안 re모듈만 공부하다가 끝났습니다. 앞으로는 그나마 평상시에 자주 쓰는 if문으로 바로 돌진하겠습니다.
반복문에서 문자열 길이 유의하기
예.. 2단계에서 보면 특정 문자를 제외하고는 문자열에서 제거해야합니다.
for i in range(len(s)):
x = s[i]
if not ('a' <= x <= 'z' or '0' <= x <= '9' or x in '-_.'):
s = s.replace(x,'')
간단한 예시입니다. 숫자나 알파벳 그리고 지정된 특수 문자 외에는 replace 함수를 통해서 해당 문자를 지우라고 명령합니다. 그런데 여기서 문제가 발생하는데요. for문의 len(s) 값은 유동적으로 변하지 않습니다. 즉 처음 문자열 길이가 5였으면 계속 숫자 5로 치환이 되서 반복문이 돌아가죠. 그 덕분에 만약 진짜 글자 하나가 중간에 지워지는 순간 문자열의 길이를 넘어가서 for문이 돌아가고 해당 인덱스에 접근하니 문제가 생깁니다.
다른 방법으로는 이제 제거해야될 문자들을 또 따로 저장해둬요. 그리고 join을 하면서 ''.join(x for x in s if x not in 제거문자열) 이런 문법을 사용하는 방식도 있습니다.
www.delftstack.com/ko/howto/python/remove-certain-characters-from-string-python/
혹은 반대로 제외되어야 될 문자를 걸러내는게 아니라 우리가 받아들일 문자들만 따로 저장하는 방식도 있습니다. 저는 이 편이 조금 더 간편해보여서 이 쪽으로 사용했습니다.
소스 코드
단계별로 함수로 묶어볼 생각이었지만 참으로 애매해서 solution 함수에 몰아넣은 코드..
아 참고로 4단계를 진행할때 이미 문자열이 텅텅 비어있는 경우도 있어서 if문으로 비었는지 아닌지 체크해봐야합니다. 또 저는 'a'~'z','0'~'9'로 문자를 체크했는데 x.isalnum()으로 x 문자가 알파벳이나 숫자인지 아닌지 체크가능하다고 합니다. 다른 사람들 풀이 보고 하나 배워가네요.
'알고리즘 > ps' 카테고리의 다른 글
[python] 로또의 최고 순위와 최저 순위 (0) | 2021.05.07 |
---|---|
[python] 수식 최대화 - 프로그래머스 (0) | 2021.05.05 |
[python] 백준 3190 뱀 (0) | 2021.03.31 |
[파이썬] 백준 바이러스 2606번 (0) | 2021.03.17 |
[파이썬] 백준 20115 에너지 드링크 (1) | 2021.03.06 |