본문 바로가기

알고리즘 삽질장

[BOJ] 1748번 - 수 이어 쓰기 1

반응형


문제설명

https://www.acmicpc.net/problem/1748

 

1748번: 수 이어 쓰기 1

첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.

www.acmicpc.net

사고과정

  • 주어지는 데이터 범위 최댓값이 1억이기 때문에 일반 loop문으로 해결해서는 시간 초과가 분명히 발생한다.
  • 따라서 고민을 많이 했는데.. 10의 자릿수(10의 제곱수) 기준으로 분할해서 1억까지의 누적 자릿수 합을 DP 테이블로 미리 만들어 놓고 N이 주어졌을 때, N의 자릿수보다 2보다 작은 인덱스값의 DP 테이블을 참조한다. 그리고 N 자릿수에서 1을 뺀 자릿수의 10의 제곱수와 N의 차이 + 1한 값에다가 N의 자릿수를 곱해주면 N과 동일한 자릿수의 10의 제곱수부터 N까지의 숫자를 붙여놓은 자릿수 값을 의미하게 된다.
  • 참고로 DP 테이블에서 누적합을 구할 때 10억에 해당하는 값도 갱신되는데 이는 0으로 다시 초기화시키자. 그래야 N이 일의 자릿수가 들어왔을 때, DP[-1]을 참조하는데, 이 때 0을 참조할 수 있도록 했다.
  • 포기하지 않고 고민을 끝까지 해서 규칙을 결국 파악해냈다..! 포기하지 않은 것에 의의를..!

풀이

import sys
input = sys.stdin.readline
# DP 테이블. 이 때 인덱스 값이 10 제곱수의 지수를 의미
dp = [0] * 10
dp[0] = 9
for i in range(1, 10):
    dp[i] = dp[i-1] + (pow(10, i+1) - pow(10, i)) * (i+1)
dp[-1] = 0

n = int(input())
length = len(str(n))
result = dp[length-2] + ((n - pow(10, length-1)) + 1) * length
print(result)
반응형

'알고리즘 삽질장' 카테고리의 다른 글

[인프런] 곳감(모래시계)  (0) 2021.11.12
[인프런] 사과나무(다이아몬드)  (0) 2021.11.12
[BOJ] 6064번 - 카잉 달력  (0) 2021.11.05
[BOJ] 14500번 - 테트로미노  (0) 2021.11.05
[BOJ] 1107번 - 리모컨  (0) 2021.11.04