PS/Math

백준 1790번: 수 이어쓰기 2 (JAVA)

닻과매 2022. 5. 31. 15:43

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)과,  k(1 ≤ k ≤ 1,000,000,000)가 주어진다. N과 k 사이에는 공백이 하나 이상 있다.

출력

첫째 줄에 앞에서 k번째 자리 숫자를 출력한다. 수의 길이가 k보다 작아서 k번째 자리 숫자가 없는 경우는 -1을 출력한다.

 

 


 

풀이

K를 '몇 번째 수', '몇 번째 위치'인지 변환하여 생각한다. Integer overflow가 발생할 수 있기에 예외 처리 시 조심한다.

 

코드

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int K = sc.nextInt();		
        int base = 1;
        while (K - 9*((int) Math.pow(10, base-1))*base > 0) {
            if (base > 8) {
                break;
            }
            K -= (int) Math.pow(10, base-1) * base * 9;
            base++;
        }
        int M = ((int) Math.pow(10, base-1)) + (K-1) / base;
        if (N < M) {
            System.out.println(-1);
            return;
        }
        String strM = M+"";
        System.out.println(strM.charAt((K-1)%base));
    }

}