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));
}
}