BOJ

수학 1790 수 이어 쓰기2

문제로 이동!

문제

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

1234567891011121314151617181920212223…

이렇게 만들어진 새로운 수에서, 앞에서 k번째 자리 숫자가 어떤 숫자인지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 N(1 ≤ N ≤ 100,000,000)과, k(1 ≤ k ≤ 1,000,000,000)가 주어진다. N과 k 사이에는 공백이 하나 이상 있다.

예제 입력

    """
    case 1:
    입력
    20 23
    출력
    6
    """

풀이

자연수를 이어 쓴다면, 1~9, 10~99, 100~999, … 으로 구분할 수 있다. “자릿수”에 따라 이어지는 숫자의 위치가 달라진다. 그럼 N번째의 숫자가 무엇인지 알기 위해서는 1~9 자리인 9개의 숫자, 10~99 자리인 180개의 숫자(자릿수가 2개이기 때문에 90*2를 해준다.), 100~999 자리인 2700개의 숫자… 로 표현할 수 있다. 그렇기 때문에 반복문을 돌면서 N에 9를 빼주고, 180을 빼주고, 2700을 빼주고를 반복한다. 이후 더이상 뺄 수 없는 숫자라면, 예를들어 9를 뺄 수 있다면 N은 10부터 시작이다. 또한 9와 180 사이의 N에서 9를 빼면 10~99 에서 숫자가 나온다. 자릿수가 2이기 때문에 2씩 나눈다면, 해당 N번째 숫자가 무엇인지 확인 할 수 있다. 이후 한번더 자릿수로 나누어 정확한 N번째 숫자가 무엇인지 구할 수 있다.

코드

    def solution(k):
        store = 0
        digit = 1
        nine = 9
    
        while k > digit * nine:
            k -= (digit * nine)
            store += nine
            digit += 1
            nine *= 10
    
        answer = (store + 1) + ((k - 1) // digit)
        if answer > n:
            return -1
        else:
            return int(str(answer)[(k - 1) % digit])
    
    
    if __name__ == "__main__":
        n, k = map(int, input().split())
        print(solution(k))

댓글남기기