Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- 다시
- 시뮬레이션
- join
- 그래프 이론
- 에라토스테네스의 체
- 구현
- GROUP BY
- 브루트포스
- 그리디
- 백트래킹
- 투포인터
- 재귀
- 자료구조
- 다익스트라
- 크루스칼
- 서브쿼리
- DFS
- 다이나믹프로그래밍
- 수학
- 분할정복
- DP
- 우선순위큐
- 다이나믹 프로그래밍
- 해시
- 트리
- BFS
- 그래프 탐색
- 누적합
- 플로이드-워셜
- MST
Archives
- Today
- Total
기록하고 까먹지 말기
1748 본문
날짜 : 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문으로 문제를 풀었지만 시간초과가 발생했다.
- 발상을 떠올리는 과정은 크게 어렵지 않았지만 이를 코드로 구현하면서 꽤나 고민을 했던 것 같다.
참고 사이트
-