https://www.acmicpc.net/problem/1748
1748번: 수 이어 쓰기 1
첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.
www.acmicpc.net
웬진모르겠지만 브루트포스에 섞여있어서,
1부터 n까지 모든 수의 len(str())을 더해서 풀었는데, 시간초과가 났다.
그래서방법을 갈구하다가,
자리의 규칙을 찾아냈다.
1+2+....+9=9 (10^0)*(9*1)
10+11.....+9=180 (10^1)*(9*2)
101+102+.....(999)=2700 (10^2)*(9*3)
예를 들어 n이 998이라면, 3자리이므로
먼져 999까지의 모든 숫자를 더해준다 9+180+2700=2889
여기서 999와 998의 차이를 구한다
999 (10^3-1) - 998=1
그후, 이 차이에 있는 숫자들은 모두 3자리이므로,
999까지 모두 생각한 결과에서, 차이에 있는 숫자들의 갯수 * 3을 빼준다.
2889-3*1=2886
문제는 엄청 쉬워보이고 코드도 간단한데 구현하기 꽤 까다로웠다.
##코드##
n=input()
ss=len(n) #몇자리수인지
answer=0
for i in range(ss):
answer+= 9*(10**i)*(i+1)
answer -= ((i+1)* ((10**ss-1)-int(n) ))
print(answer)
'boj' 카테고리의 다른 글
| 백준 2565 전깃줄 (0) | 2022.04.04 |
|---|---|
| 백준 11170 0의 개수 (0) | 2022.04.03 |
| 백준 1107 리모컨 (0) | 2022.04.02 |
| 백준 1476 날짜 계산 (0) | 2022.04.02 |
| 백준 3085 사탕 게임 (0) | 2022.04.01 |