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문으로 문제를 풀었지만 시간초과가 발생했다.

- 발상을 떠올리는 과정은 크게 어렵지 않았지만 이를 코드로 구현하면서 꽤나 고민을 했던 것 같다.

 

 

참고 사이트