알고리즘 연습/수학, 정수론, 기하

[🥈3 / 백준 1748 / 파이썬] 수 이어 쓰기 1

김세진 2021. 10. 25. 16:43
반응형

 

 

1748번: 수 이어 쓰기 1

첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.

www.acmicpc.net

 

문제

1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.

 

1234567891011121314151617181920212223...

 

이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.

출력

첫째 줄에 새로운 수의 자릿수를 출력한다.

 

예제 입력 1 

5

예제 출력 1 

5

예제 입력 2 

15

예제 출력 2 

21

예제 입력 3 

120

예제 출력 3 

252

 

풀이

 

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)
반응형