본문 바로가기
코딩테스트/Beakjoon

백준 1790번 : 수 이어 쓰기 2 [Python]

by 나스나키 2024. 1. 16.
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