문제
문제 이해
처음에 발견했던 규칙이
1자리수는 1씩늘어나고
2자리수는 2씩늘어나고
3자리수는 3씩 늘어나고
...
그렇다면 예를들어 120이 들어왔을 때 100 ~ 120까지의 수를 제외하면 1자리수, 2자리수의 갯수의 값과 같습니다.
220이 들어왓을 때 100 ~ 220까지의 수를 제외하면 1~99까지의 자리수는 같겠죠
1~9 => 9개
10~ 99 => 90개
100 ~ 999 => 900 개
이런식으로 규칙을 가졌습니다.
그렇다면
- 1일 때는 9 * 1 * 1
- 2일 때는 9 * 10 * 2
- 3일 때는 9 * 100 * 3
의 규칙을 찾을 수 있습니다.
ex) 220이 들어왔을 때 먼저 1~99 의 자리수를 구하고 100 ~ 200의 값을 따로 구하면 됩니다.
코드
num = int(input())
t = [1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000]
n = str(num)
length = len(n) - 1
result = 0
for i in range(1, length + 1):
result += 9 * t[i-1] * i
result += (num - t[length] + 1) * len(n)
print(result)
4자리수가 들어왔다면 3자리수 까지의 결과를 먼저 구하고
3자리수가 들어왔다면 2자리수 까지의 결과를 먼저 구합니다.
그 이전의 자리수는 length 변수에 있습니다.
진짜 구해야 할 값은 그 수의 자리수를 뺀다음 +1을 해줍니다.(0도 포함시켜야 합니다.)
728x90
'알고리즘 > 백준알고리즘' 카테고리의 다른 글
[백준 알고리즘/Python] 11724 연결 요소의 개수 (0) | 2022.02.21 |
---|---|
[백준 알고리즘/Python] 1260 DFS와 BFS (0) | 2022.02.19 |
[백준 알고리즘/Python] 6064 카잉 달력 (0) | 2022.02.16 |
[백준 알고리즘/Python] 1107 리모컨 (0) | 2022.02.16 |
[백준 알고리즘/Python] 1476 날짜 계산 (0) | 2022.02.14 |