728x90

https://www.acmicpc.net/problem/1790
1790번: 수 이어 쓰기 2
첫째 줄에 N(1 ≤ N ≤ 100,000,000)과, k(1 ≤ k ≤ 1,000,000,000)가 주어진다. N과 k 사이에는 공백이 하나 이상 있다.
www.acmicpc.net
문제
1부터 N까지의 수를 이어서 쓰면 다음과 같이 새로운 하나의 수를 얻을 수 있다.
1234567891011121314151617181920212223...
이렇게 만들어진 새로운 수에서, 앞에서 k번째 자리 숫자가 어떤 숫자인지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N(1 ≤ N ≤ 100,000,000)과, k1 ≤ k ≤ 1,000,000,000)가 주어진다. N과 k 사이에는 공백이 하나 이상 있다.
출력
첫째 줄에 앞에서 k번째 자리 숫자를 출력한다. 수의 길이가 k보다 작아서 k번째 자리 숫자가 없는 경우는 -1을 출력한다.
예시

코드
import sys
num = list(map(int, sys.stdin.readline().split()))
cnt = 1
count = 9
now = 0
while num[1] > cnt * count:
num[1] -= (cnt * count)
now += count
cnt += 1
count *= 10
now = (now + 1) + (num[1] - 1) // cnt
if now > num[0]:
print(-1)
else:
print(str(now)[(num[1] - 1) % cnt])
코드 해석
- 두 정수를 받는다.
- 필요 변수들의 값을 초기화한다.
- 입력받은 두 번째 숫자가 현재까지 만들어진 수열의 길이보다 큰 경우에 반복합니다.
- 입력받은 두 번째 숫자에서 현재까지 만들어진 수열의 길이를 빼줍니다.
- 현재까지 만들어진 수열의 길이를 업데이트합니다.
- 자릿수를 증가시킵니다.
- 다음 자릿수까지의 수열 길이를 업데이트합니다.
- k번째 자리의 숫자를 계산합니다.
- 계산된 숫자가 입력받은 첫 번째 숫자(num[0])보다 크면 -1을 출력하고 프로그램을 종료합니다.
- 그렇지 않으면 계산된 숫자를 문자열로 변환하고, k번째 자리의 숫자를 출력합니다.

728x90
'코딩테스트 > Beakjoon' 카테고리의 다른 글
| 백준 1929번 : 소수 구하기 [Python] (0) | 2024.01.16 |
|---|---|
| 백준 1920번 : 수 찾기 [Python] (0) | 2024.01.16 |
| 백준 1712번 : 손익분기점 [Python] (0) | 2024.01.16 |
| 백준 1629번 : 곱셈 [Python] (0) | 2024.01.16 |
| 백준 1550번 : 16진수 [Python] (0) | 2024.01.16 |