박봉달의 개발생활

Today's Algoritm : 파이썬 알고리즘-12 (탐색)숫자만 추출 본문

Projects/Algorithm

Today's Algoritm : 파이썬 알고리즘-12 (탐색)숫자만 추출

박봉달 2021. 5. 27. 15:34
728x90

파이썬 알고리즘에 대해서 정리해볼 예정이다. 기본부터 탄탄히 만들어가보려고 적어가는 과정.

알고리즘을 짜는데는 오래 걸리는데 막상 코드를 짜면 이렇게 짧은가 싶다.

문제 출처는 아래 벨로그에서!

 

파이썬 알고리즘-12 (탐색)숫자만 추출

12.숫자만 추출

velog.io


1. 문제

문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만

듭니다. 만들어진 자연수와 그 자연수의 약수 개수를 출력합니다.

만약 “t0e0a1c2h0er”에서 숫자만 추출하면 0, 0, 1, 2, 0이고 이것을 자연수를 만들면 120이

됩니다. 즉 첫 자리 0은 자연수화 할 때 무시합니다. 출력은 120를 출력하고, 다음 줄에 120

의 약수의 개수를 출력하면 됩니다.

추출하여 만들어지는 자연수는 100,000,000을 넘지 않습니다.

▣ 입력설명

첫 줄에 숫자가 섞인 문자열이 주어집니다. 문자열의 길이는 50을 넘지 않습니다.

▣ 출력설명

첫 줄에 자연수를 출력하고, 두 번째 줄에 약수의 개수를 출력합니다.

▣ 입력예제 1

g0en2Ts8eSoft

▣ 출력예제 1

28

6


2. 생각 과정

문자열을 받고 거기서 숫자만 출력하는 것이 관건인 문제가 되겠다. 그 이후에는 2부터 그 숫자까지의 약수의 개수를 출력하는 문제. 일단 간단히 문제를 파악해보자면 문자열을 받아 숫자인 것만 탐색하여 남기는 것이 1차적 목표이며, 그 숫자까지의 약수의 개수를 파악하여 출력하는 것이 2차적 목표가 되겠다.

그렇다면 문자열에서 숫자만 걸러내는 방법은 무엇이 있을까?

첫번째는 정규표현식을 사용하여 (re) 걸러내는 방법이다. re.findall() 을 사용하여 추출할 수 있고, 이는 리스트로 반환되어진다. 가장 정확하게 추출할 수 있는 방법이지만, 이는 리스트에서 다시 추출된 각 숫자를 다시 합쳐서 정수화시켜야하기에 과정이 길다고 생각되어 구글링을 더 해보았다.

https://notstop.co.kr/948/

 

파이썬(Python) 문자열에서 숫자만 추출하기 - Code Hunter

새 글 추가하기임시글 저장하기미리보기발행하기28/100제목 추가하기파이썬(Python) 문자열에서 숫자만 추출하기 문자열에서 숫자들만 추출하기 위한 라이브러리로 re 를 사용할 것입니다. re 는

notstop.co.kr

 

두번째로 찾은 방법은 조금 더 간단하다.

https://hello-bryan.tistory.com/218

 

[Python] get number from string #텍스트에서 숫자만 가져오기

Python '25일 전', '1249 views' 등 에서 숫자인 25, 1249 만 뽑아낼 때, 간단하게 이렇게 씁니다. str1 = "25 일 전" days = int(''.join(list(filter(str.isdigit, str1)))) print(days) # 25 이 코드의 문제점..

hello-bryan.tistory.com

// 예시

str1 = "25 일 전"
days = int(''.join(list(filter(str.isdigit, str1))))
print(days)
# 25

이처럼 join과 filter를 사용하여 숫자인지 파악하고 숫자만을 반환하는 방법이다. 이는 리스트에서 바로 정수화를 시키는 과정을 포함하기 때문에 숫자가 바로 추출된다는 장점이 있지만, 마이너스 기호(-)가 표현될수 없다는 단점이 존재한다. 하지만 문제에서는 마이너스까지 요구하지 않기 때문에 더욱 빠른 방법을 가지고 문제를 해결해보려고 한다.

filter 함수에 대한 깊은 설명은 아래 링크에 설명되어 있다.https://wikidocs.net/22803

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

join 함수에 대한 깊은 설명은 아래 링크에 설명되어 있다. https://blockdmask.tistory.com/468

 

[python] 파이썬 join 함수 정리 및 예제 (문자열 합치기)

안녕하세요. BlockDMask입니다. 오늘은 파이썬에서 리스트를 문자열로 일정하게 합쳐주는 join 함수에 대해서 알아보려고 합니다. join 함수는 문자열을 다룰 때 유용하게 사용할 수 있는 함수이니

blockdmask.tistory.com


또 약수를 쉽게 구하는 방법은 무엇이 있을까? 약수는 목표의 수를 임의의 수로 나누었을 때 나머지가 생기지 않는, 한마디로 나눌 수 있는 수를 의미한다. 아래의 링크를 참고하여 문제를 해결해보면, 문자열에서 추출한 수를 for문을 가지고 반복문을 돌려서, 목표의 수를 임의의 수로 나누어 나머지가 0이 되면 count를 1 더해주는 코드를 짜주면 될 것 같다.

https://yoon735.tistory.com/entry/PythonA001%EC%95%BD%EC%88%98%EC%9D%98-%EA%B0%9C%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0

 

파이썬 알고리즘_#01_약수의 개수 구하기

문제 어떤 자연수 n이 주어졋을때 그 자연수의 약수의 개수를 구하여라. 입력 설명 자연수 n을 입력받아라. 출력 설명 자연수 n의 약수의 개수를 출력하라. 입력 예제 20 출력 예제 6 답 n = int(input(

yoon735.tistory.com

그렇다면 간단히 의사코드를 작성해보고 넘어가보도록 하자.

1. 문자열을 입력 받음

2. 문자열에서 숫자만을 걸러낸 문자열을 추출 -> 정수형으로 변환 (예를 들어 00120이라면 정수형으로 바꿀 시 120으로 무시됨)

3. 정수형으로 변환한 자연수를 출력하고

4. 그 자연수까지에 존재하는 약수를 구해 다음줄에 출력하기.


3. 내 코드

# filter를 사용하여 만든 코드
str1 = input()
nums = int(''.join(list(filter(str.isdigit, str1))))
count = 0

for i in range(1, nums + 1):
    if nums % i == 0:
        count += 1

print(nums, count, sep = '\n')
# 정규표현식을 사용하여 만든 코드
import re

str1 = input()
num_str = re.findall("\d+", str1)
nums = int(''.join(num_str))
count = 0

for i in range(1, nums + 1):
    if nums % i == 0:
        count += 1

print(nums, count, sep = '\n')

4. 풀이 코드

s=input()
res=0
for x in s:
    if x.isdecimal():
        res=res*10+int(x)
print(res)
cnt=0
for i in range(1, res+1):
    if res%i==0:
        cnt+=1
print(cnt)

5. 배운점

- 나는 문자열에서 숫자인 부분을 리스트로 추출해서 정수형으로 바꾸는 작업을 했는데, 아마 이게 메모리 소모가 더욱 커서 풀이 코드는 메모리 활용에 중점을 두고 짠 코드가 나온 것 같다. isdecimal() 메서드는 숫자 (0~9)까지 구할 수 있으며, 여기서 res = res*10+int(x)라고 나온 코드는 탐색을 할 때 그 숫자들이 차차 쌓이는(?) 개념으로 가야하기 때문에 2가 있는 상황에서 8이 나온다면 28이 되어야하기 때문에 10을 곱해주어 자릿수 자체를 올려준 것 같다.

- 10 이상의 수를 찾기 위해서는 isdigit()을 사용한다.

메모리 활용에 조금 더 중점을 두어 코드를 짜는 연습도 해봐야겠다!

 

728x90
반응형