전공/백준
1748
yha97
2022. 12. 11. 19:25
날짜 : 2022. 12. 11
사용 언어 : python
문제

코드
import sys
n = int(sys.stdin.readline())
t = len(str(n)) - 1 # 10의 n승 확인
res = 0
if n < 10: print(n)
else:
for i in range(t, 0, -1):
res += 9 * (10 ** (i-1)) * i
#print(res)
for i in range(10 ** t, n + 1):
res += (t + 1)
print(res)
풀이
- 수를 입력받고 그 수의 자릿수를 확인한다.
- 그리고 그 (자릿수 - 1) 까지의 수의 개수를 더한다.
예를들어 21의 경우 2자리 수이며, 10의 멱승인 수인 10. 즉, 1 ~ 9까지는 고정적으로 확보된다.
그렇기 때문에 (1 ~ 9까지 개수) * 1 + (10 ~ 21까지의 개수) * 2 라는 규칙이 도출된다.
다른 예시의 경우 121을 살펴보면, 121의 자릿수는 3이며 가장 큰 10의 멱승인 수는 100이다.
그렇기 때문에 아래와 같은 규칙인 도출된다.
1 ~ 9 : 1자리
10 ~ 99 : 2자리
------------------------------
100 ~ 121 :
=> 1자리의 경우 고정적으로 9, 2자리의 경우 고정적으로 90이 나오며 100부터 121까지는 3자리가 나타난다.
- 이를 알고리즘으로 구현하여 문제를 해결하면 된다.
알게된 점
- 처음 for문으로 문제를 풀었지만 시간초과가 발생했다.
- 발상을 떠올리는 과정은 크게 어렵지 않았지만 이를 코드로 구현하면서 꽤나 고민을 했던 것 같다.
참고 사이트
-