[Algorithm] 숫자만 추출

myeonji·2022년 1월 19일
0

Algorithm

목록 보기
7/89

문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만
듭니다. 만들어진 자연수와 그 자연수의 약수 개수를 출력합니다.
만약 “t0e0a1c2h0er”에서 숫자만 추출하면 0, 0, 1, 2, 0이고 이것을 자연수를 만들면 120이
됩니다. 즉 첫 자리 0은 자연수화 할 때 무시합니다. 출력은 120를 출력하고, 다음 줄에 120
의 약수의 개수를 출력하면 됩니다.
추출하여 만들어지는 자연수는 100,000,000을 넘지 않습니다.

문자열 중에 숫자만 어떻게 찾아내는지 한참을 고민했다.
아스키코드로 해야하나 싶어서 (아스키코드) 0~9 -> (10진수) 48~57 를 이용하려고 시도했지만 풀리지가 않았다. 결국 해설 앞부분을 살짝 봤는데 숫자 판별 함수를 이용하는 거였다.. 난 모르는 파이썬 내장함수였기에 당연히 풀 수 없었구나..

<숫자 판별 함수 : 주어진 !!문자열!!이 숫자로 되어있는지 검사하는 함수>

  • isdigit() : 해당 문자열이 '숫자' 로 이루어져 있는지 검사한다.
  • isdecimal() : 0~9까지의 숫자만 찾기 = 주어진 문자열을 int형으로 반환 가능해야한다.
  • isnumeric() : 숫자값 표현에 해당하는 문자열까지 인정, 수로 볼 수 있는 것을 말한다. 제곱근, 분수, 거듭제곱 등

<내 답안>

s = input()
string = ''
for x in s:
    if x.isdecimal():
        string = string + x
intstr = int(string)
print(intstr)

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

print(count)

함수 사용하면 쉽게 풀리는 걸.. 나는 왜 방법이 안 떠오른다며 부여잡고 있었는가.. 공부 더 해야겠다.. 파이썬 내장함수도 모르고 말야..

<모범답안>

s = input()
res = 0
for x in s:
    if x.isdecimal():
        res = res*10+int(x)  # 최고 첫 자리의 0을 무시할 수 있음
print(res)
cnt = 0
for i in range(1, res+1):
    if res % i == 0:
        cnt += 1
print(cnt)

해설을 들으니 내 코드와 살짝 다른 부분이 있다.
나는 isdecimal을 이용하여 숫자 판별이 되면 그걸 string 이라는 변수에 문자열로 이어서 붙인 다음 한번에 string을 int형으로 바꾸었다.
하지만 해설 코드에서는 res 변수를 사용하여 일의 자리부터 숫자로 만드는 코드로 작성했다. 최고 첫 자리의 0은 계속 무시할 수 있기 때문에 이 코드가 더 효율적인 것 같다.
물론 내 코드도 첫 자리 0을 무시하기는 하지만.. res 변수를 이용한 해설 방법도 알아둬야겠다. 숫자를 이런 방식으로 만들 수도 있겠구나.

0개의 댓글