daniel7481의 개발일지

2021.12.05 BOJ 1748 수 이어쓰기 1 본문

BOJ

2021.12.05 BOJ 1748 수 이어쓰기 1

daniel7481 2021. 12. 5. 18:27
반응형

문제

1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.

1234567891011121314151617181920212223...

이렇게 만들어진 새로운 수는 몇 자리 수일까? 이 수의 자릿수를 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 새로운 수의 자릿수를 출력한다.

풀이

요즘 알고리즘을 풀면서 벽을 느끼고 있다.... 자신감도 떨어지고 그런거 같아서 실버 문제를 풀어보기로 했다. 역시 돌고 돌아 구현이라고 구현 문제로 돌아왔다. 1자리 수는 1개의 자리를 차지하고, 10 자리수는 2개의 자리수를 차지하고 이렇게 계속 더해주는식으로 문제를 풀어보려고 했다. 1~9까지는 9개, 10~99까지는 90개. 100~1000까지는 900개 등등 9*10**(자리수-1)더해주고, 만약 1800처럼 100자리수(100~999)까지는 for문으로 9*10**(i-1)을 i만큼 곱해준 값을 더해주고, 1800-999의 갯수만큼 n으로 주어지는 숫자의 자릿수를 곱해주면 답을 구할 수 있다고 생각했다.

n = int(input())
ans = 0
length = len(str(n))
if length == 1:
  ans += length*((n%(10**(length))))
else:
  for i in range(1, length):
    ans += 9*10**(i-1)*i
  ans += length * (n-10**(length-1)+1)
print(ans)

n의 범위가 1억까지인만큼 1중반복문으로도 풀 생각은 하지 않았던 것 같다.

반응형

'BOJ' 카테고리의 다른 글

[BOJ] 11559 Puyo Puyo  (0) 2021.12.07
[BOJ] 10830 행렬 제곱  (0) 2021.12.05
[BOJ] 2636/2638 치즈  (0) 2021.12.05
2021.12.03 BOJ 9935 문자열 폭발  (0) 2021.12.03
2021.12.03 BOJ 11660 구간 합 구하기 5  (0) 2021.12.03