2024. 6. 18. 20:53ㆍ개발의 흔적/코딩테스트
제목 : 숫자만 추출
문자와 숫자가 섞여있는 문자열이 주어지면 그 중 숫자만 추출하여 그 순서대로 자연수를 만 듭니다. 만들어진 자연수와 그 자연수의 약수 개수를 출력합니다.
만약 “t0e0a1c2h0er”에서 숫자만 추출하면 0, 0, 1, 2, 0이고 이것을 자연수를 만들면 120이 됩니다.즉첫자리0은자연수화할때무시합니다. 출력은120를출력하고,다음줄에120 의 약수의 개수를 출력하면 됩니다.
추출하여 만들어지는 자연수는 100,000,000을 넘지 않습니다.
<입력설명>
첫 줄에 숫자가 썩인 문자열이 주어집니다. 문자열의 길이는 50을 넘지 않습니다.
<출력설명>
첫 줄에 자연수를 출력하고, 두 번째 줄에 약수의 개수를 출력합니다.
g0en2Ts8eSoft
출력예제28
6
문자열의 각 문자를 유니코드(Ascii 코드도 된다. 애초에 영문자와 숫자만 문자열에 포함되어있으니까)로 변환해서,
0에 해당하는 유니코드 ~ 9에 해당하는 유니코드에 해당한다면 (즉, 그 문자가 아리비아 숫자라면)
그것들만 문자열의 합으로 표현.
그것을 위한 파이썬 내장함수 ord()
(ascii코드를 것은 자연스럽게 외워지는게 아니라면, 그냥 매번 찍어보는게 오히려 빠를것이다. 어차피 0~9 / a~z / A~Z 까지는 모두 연속하기 때문에)
그리고 마지막으로 integer값으로 해당 숫자문자열을 변환.
(마지막에 변환하면, 000012 같은 숫자문자열도 손쉽게 12로 변한다.)
(각 숫자문자마다 일일히 integer로 변환한다면, 해당 자릿수를 계산해야되는 번거로움 존재)
마지막으로 약수 구하는건 언제나 그랬듯, 제곱수까지의 약수 구하고, 해당 대칭 약수 구하는 방식.
https://leerosepark.tistory.com/25
[구현] (2-1) 약수 구할때에 시간복잡도 줄이기
문제어떤 자연수 p와 q가 있을 때, 만일 p를 q로 나누었을 때 나머지가 0이면 q는 p의 약수이다. 6을 예로 들면 6÷1=6...0 6÷2=3...0 6÷3=2...0 6÷4=1...2 6÷5=1...1 6÷6=1...0 그래서 6의 약수는 1, 2, 3, 6, 총 네
leerosepark.tistory.com
import sys
input = sys.stdin.readline
from math import sqrt
# print(ord('0')) #48
# print(ord('9')) #57
task = input().strip()
new_num = ""
for i in range(len(task)):
char = task[i]
if 48 <= ord(char) <= 57:
new_num += char
new_num = int(new_num)
print(new_num)
median = int(sqrt(new_num))
cnt = 0
have_sqrt = True if median**2 == new_num else False
for i in range(1,median+1):
if new_num%i == 0:
cnt += 1
print(cnt*2-1) if have_sqrt else print(cnt*2)
'개발의 흔적 > 코딩테스트' 카테고리의 다른 글
| [구현] (3-4) list 합치기: merge sort (0) | 2024.06.18 |
|---|---|
| [구현] (3-3) list reverse의 마법 [:: -1] (0) | 2024.06.18 |
| [구현] (3-1) 회문 문자열 검사: for else문 / reverse ([::-1]) (1) | 2024.06.17 |
| [구현] (3-6) 격자판의 합 : 한 iteration 최대한 써먹기 (0) | 2024.06.17 |
| [two pointer] (3-5) list의 구간을 두개의 포인터로, 시간복잡도 줄이기 (0) | 2024.06.17 |