문제설명
https://school.programmers.co.kr/learn/courses/30/lessons/181921
내 코드
def solution(l, r):
answer = []
for i in range(l, r+1):
if '0' in str(i) or '5' in str(i):
if '1' not in str(i):
if '2' not in str(i):
if '3' not in str(i):
if '4' not in str(i):
if '6' not in str(i):
if '7' not in str(i):
if '8' not in str(i):
if '9' not in str(i):
answer.append(i)
if(len(answer)==0): answer = [-1]
return answer
처음에 어떻게 풀지 몰라서 이렇게 구린 코드를 만들었다. 굉장히 단순하고 구리다.
뭐,,,, 직관적으로 보기에는 굉장히 좋은 코드기는 하다!
그러나....
ㅋㅋㅋㅋㅋㅋ
그래서 답은 맞았지만, 정규표현식 이라는 새로운 개념을 도입해보았다.
정규표현식을 사용한 코드!
import re
def solution(l, r):
answer = []
reg = re.compile('[05]+')
for i in range(l, r+1):
m = reg.findall(str(i))
if len(m)==1 and len(m[0]) == len(str(i)): answer.append(i)
return answer if len(answer) > 0 else [-1]
정규표현식을 배워보기는 했지만, 잘 사용하지도 않기 때문에 처음 배울 때 빼고는 한 번도 사용해본 적이 없다.
정규표현식이란?
정규표현식(Regular expressions)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 복잡한 문자열의 검색과 치환을 위해 사용된다.
정규표현식을 사용하기 위해서는 re 모듈을 사용해야 하는데, 이는
import re를 통해 사용할 수 있다.
reg = re.compile('[05]+')
for i in range(l, r+1):
m = reg.findall(str(i))
print(m)
"""
# 결과
['5']
[]
[]
[]
[]
['0']
.
.
.
"""
re.compile을 사용하여 정규표현식을 컴파일할 수 있으며, 이 리턴값(reg)을 reg에 할당해 이후의 작업을 수행할 수 있다.
컴파일하고자 하는 '[05]+'의 의미는
'[' 와 ']' 사이의 문자들과 매치라는 의미를 갖고 있는데,
즉, 정규 표현식이 [abc] 라면 이 의미는 'a, b, c' 중 어느 것이라도 있으면 매치' 라는 뜻이다.
(대괄호 사이에 '-'을 넣으면 범위를 의미하게 된다. 예를 들어 1~9는 [1-9] 이며,
'^'는 제외하고자 하는 의미이며, 예를 들어 [^0-9]는 숫자를 제외한다는 의미이다.
또한 '+' 문자는 반복을 나타내는 문자로, 최소 1번 이상 반복될 때 사용하는 것인데,
예를 들어 [ca+t] 라는 정규식에서는 ct는 매칭되지 않고, cat, caaaaaaaaaaaat 등이 매칭된다!
따라서, 문제에서는 0과 5만으로 사용된 문자를 뽑아내고 싶으므로,
re.compile('[05]+')
을 사용하였는데, 정리하자면 0 혹은 5가 포함된 문자 중 0과 5가 최소 1번 이상 반복된 것을 뽑아온다.
그리고,
for i in range(l, r+1):
을 통해 l부터 r+1까지 범위를 순회하는데,
m = reg.findall(str(i))
를 통해 앞에서 매치되는 모든 값을 찾아 m(리스트)으로 반환다는 것이다!
이 때, m의 값은 비어있거나, 겹치는 값이 있거나, 매칭되는 값이 여러개일 수 있기 때문에 조건문을 통해 걸러준다.
예를 들어
1) [50555506665555]
는 ['5055550', '5555']로 나오기 때문에 우리가 원하는 값이 아니다.
또한,
2) [5555123]
은 ['5555']로 나오기 때문에 이 역시 우리가 원하는 값이 아니다.
1번 케이스의 경우는 m 리스트의 길이가 1일 때만 추출함으로써 예외를 해결할 수 있고,
2번 케이스의 경우에는 m 리스트의 첫 번째 값과 원하는 문자의 길이가 같을 때만을 추출함으로써 해결할 수 있다!
최종적으로 정규표현식을 사용한 답은 이와 같다!
import re
def solution(l, r):
answer = []
reg = re.compile('[05]+')
for i in range(l, r+1):
m = reg.findall(str(i))
if len(m)==1 and len(m[0]) == len(str(i)): answer.append(i)
return answer if len(answer) > 0 else [-1]
끄읏-!
'코딩테스트 > PYTHON' 카테고리의 다른 글
[프로그래머스][PYTHON] Lv. 0 세로 읽기 (0) | 2024.01.23 |
---|---|
[프로그래머스][PYTHON] Lv. 0 문자열 여러 번 뒤집기 (1) | 2023.12.29 |
[프로그래머스][PYTHON] Lv. 0 수열과 구간 쿼리 4 (0) | 2023.12.27 |
[프로그래머스][PYTHON] Lv. 0 수열과 구간 쿼리 2 (0) | 2023.12.27 |
[프로그래머스][PYTHON] Lv. 0 수열과 구간 쿼리 3 (0) | 2023.12.27 |