반응형
문제
1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.
1234567891011121314151617181920212223...
이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.
출력
첫째 줄에 새로운 수의 자릿수를 출력한다.
예제 입력 15 |
예제 출력 15 |
예제 입력 215 |
예제 출력 221 |
예제 입력 3120 |
예제 출력 3252 |
풀이
n이 매우 크기 때문에 수를 직접 만들어 길이를 센다면 당연히 시간초과에 걸릴 것이다.
따라서 일정한 패턴을 찾아 공식을 구하여 문제를 해결해야 한다.
210 을 예로 들겠다.
n의 자릿수는 d라고 하겠다. 즉, 3이 된다.
210은 3자리 수이고, 100부터 210까지 총 111 개의 수가 있다. 즉, n-10**(d-1)+1 가 가장 큰 자리수부터 시작한 수의 개수가 된다.
이제 1부터 99까지의 자리수를 구해야 한다.
2자릿수의 수는 10부터 99까지가 있다. 즉, 90 * 2를 총합에 더해주면 된다.
이는 d*(10**d - 10**(d-1)) 처럼 표현할 수 있다.
1부터 9까지는 9 * 1 이 된다.
따라서, 111*3 + 90*2 + 9*1 = 522 이다.
n = int(input())
if n < 10:
print(n)
else:
ans = 0
d = len(str(n))
ans += (n-10**(d-1)+1) * d
d-=1
while d>0:
ans += d*(10**d - 10**(d-1))
d-=1
print(ans)
반응형
'알고리즘 연습 > 수학, 정수론, 기하' 카테고리의 다른 글
[🥈4 / 백준 1049 / 파이썬] 기타줄 (0) | 2021.11.07 |
---|---|
[🥉2 / 백준 1075 / 파이썬] 나누기 (0) | 2021.11.06 |
[🥈3 / 백준 10972 / 파이썬] 다음 순열 (0) | 2021.10.24 |
[🥈3 / 백준 1735 / 파이썬] 분수 합 (0) | 2021.10.10 |
[🥈1 / 백준 6588 / 파이썬] 골드바흐의 추측 (0) | 2021.10.08 |