티스토리 뷰
이번에 프로그래머스 여름방학 인턴을 지원해서 슬슬 알고리즘 문제를 풀어야할 것 같아서 시작했다.
정처기 실기도 공부해야하는데 아마 둘 다 잡으려다가 놓칠 것 같기도 하다..
열심히 해보자!!
문제에 대한 설명은 건너 뛰고 바로 코드부터 보자
아래의 코드가 내가 푼 코드이다.
차례차례 7단계까지 조건을 통과하면서 조건에 맞는 answer가 나온다.
결과만 보면 괜찮지만 다른 사람의 풀이를 한 번 보자
def solution(new_id):
answer = ''
new_id = new_id.lower()
for word in new_id:
if word.isalnum() or word in '-_.':
answer += word
while '..' in answer:
answer = answer.replace('..', '.')
if answer[0] == '.' and len(answer) > 1:
answer = answer[1:]
if answer[-1] == '.':
answer = answer[:-1]
if answer=='':
answer = 'a'
if len(answer)>=16:
answer = answer[:15]
if answer[-1] =='.':
answer = answer[:-1]
if len(answer)<3 :
answer = answer + (3-len(answer))*answer[-1]
return answer
이것은 다른 사람이 정규식을 이용해 푼 코드이다.
벌써 간결한 것이 느껴진다..
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
자세히 알아보자면
python에서는 정규식을 이용하여 문자 치환을 해결할 수 있다.
하지만 복잡하기 때문에 제대로 알고 있지 않으면 활용하기 힘들다..
그래서..
이번 기회에 정규식을 배워보자!
먼저 정규식에는 메타 문자라는 것이 있다.
메타 문자는 2가지로 나뉘는데 매치가 진행될 때 문자열이 바뀌는 것(소비한다라고도 한다)과 아닌 것이 있다.
|
or 과 같은 의미로 쓰인다.
^
문자열의 맨 처음을 뜻한다. 하지만 쓰이는 곳에 따라서 not의 의미를 가지기도 한다.
$
문자열의 시작을 뜻한다.
[ ]
문자 클래스를 뜻하며 이것이 감싸고 있는 것은 문자라는 것을 의미한다.
.
어떠한 문자를 의미하며 모든 문자를 의미하기도 한다.
말이 좀 애매한데 예시를 들자면
a.b 는 adb, apb, ab, a6b, a*b 등등 여러 문자와 같다는 의미가 된다.
*
반복을 의미하며 꼭 1번 이상이 아니라 0번이어도 된다.
a*b 는 b, ab, aab, aaaaab 등 여러 문자와 같다.
+
반복이긴 하나 1회 이상 반복을 해야한다.
a+b 는 b일 수 없다.
{m, n}
m번부터 n번 사이 반복을 의미한다. 리스트의 인덱싱처럼 사용할 수 있다.
ca{2,4}t = caat, caaat, caaaat 만 된다. cat은 a가 2번 이상 반복되지 않았기 때문에 속할 수 없다.
?
있어도 그만 없어도 그만이다.
그럼 다른 사람의 코드를 한 번 보겠다.
import re
def solution(new_id):
st = new_id
# 대문자를 소문자로 바꾸기
st = st.lower()
# ^ : [] 안에 있으니 not으로 사용, a-z : 알파벳 소문자, 0-9 : 숫자, \ : 특수문자 앞에 붙음
st = re.sub('[^a-z0-9\-_.]', '', st)
# .+ : .이 1개 이상 존재,
st = re.sub('\.+', '.', st)
# ^ : [] 밖에 있으니 문자열의 맨 처음, $ : 문자열의 맨 뒤
st = re.sub('^[.]|[.]$', '', st)
# 길이가 0 이면 a 대입하고 아니면 슬라이싱
st = 'a' if len(st) == 0 else st[:15]
# ^ : [] 밖에 있으니 문자열의 맨 처음, $ : 문자열의 맨 뒤
st = re.sub('^[.]|[.]$', '', st)
# 길이가 2 초과면 그냥 냅두고 아니면 뒷자리를 (3-길이)만큼 더 붙이기
st = st if len(st) > 2 else st + "".join([st[-1] for i in range(3-len(st))])
return st
'알고리즘' 카테고리의 다른 글
[leetcode] 168. Excel Sheet Column Title / python ord 함수 / python chr 함수 (0) | 2024.01.17 |
---|---|
[백준][Python] 암호 만들기 (0) | 2022.07.21 |
[백준][Python] 단어 수학 (0) | 2022.07.19 |
[Python] map 함수를 적용한 결과물의 타입 (0) | 2021.07.27 |
[백준][Python] 멀티탭 문제 (0) | 2021.07.16 |
- Total
- Today
- Yesterday