코딩테스트

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

과아아앙 2021. 3. 30. 21:02

문제 출처 : www.acmicpc.net/problem/1748

 

1748번: 수 이어 쓰기 1

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

www.acmicpc.net

문제

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

1234567891011121314151617181920212223...

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

입력

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

출력

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

 

내 풀이

n = int(input())

answer = 0
for i in range(1, n + 1):
    answer += len(str(i))

print(answer)

처음에는 진짜 단순히 str으로해서 일일이 세우 준 후 더하는 방식으로 짜봤다. 

pypy에서는 맞았습니다가 나왔지만, python에서는 당연하게도 시간초과가 떴다.

그래서 규칙성을 찾았는데

주어진 숫자의 자릿수보다 하나 적은 자릿수의 수는 9 * (10)^(n-1)개 이며 

여기에 각 자릿수를 곱하면 되는 규칙이 있었다.

즉, 9 * (10)^(n-1) * (n)의 규칙을 따른다.

이 후에 해당 규칙과 함께 마지막 자리수는 이전 개수를 빼서 똑같이 해주면 되기에 구현을 해주었다.

n = input()

comp = len(n) - 1

answer = 0

for i in range(comp):
    answer += 9 * (10 ** i) * (i + 1)
    i += 1
answer += ((int(n) - (10 ** comp)) + 1) * (comp + 1)

print(answer)