#include <iostream>
using i64 = long long;
using namespace std;
int ten[10] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
int nn[10] = {0, 9, 90, 900, 9000, 90000, 900000, 9000000, 90000000, 900000000};
int ns[10] = {0, 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999};
int main() {
int n, k;
scanf("%d %d", &n, &k);
int len;
i64 sum = 0;
for(int i = 1; i <= 9; i++){
if(ns[i-1] < n && n <= ns[i]){
if(sum + (n-ns[i-1])*(i64)i < k){
printf("-1");
break;
}
len = i;
}
i64 before = sum;
sum += nn[i]*(i64)i;
if(before < k && k <= sum){
i64 index = (k-before+i-1)/i; //이건 2(i)자리 수 중 몇 번째인지
i64 num = index + before; //k가 위치한 숫자
i64 b_index = before + (index-1)*i; //이전 숫자의 index
int t = i - (k - b_index); //k가 위치한 숫자의 어디에 있는지
printf("%d", num%ten[t+1]/ten[t]);
}
}
return 0;
}
ㅜㅜ
ㅜㅜ
ㅜㅜ
ㅜ
ㅜㅜ
어려워ㅜ
너무ㅠ 짜잘하게 복잡하다
그리고 틀렸음ㅠㅠ
로직은 k가 어느 숫자 위에 위치했는지 찾아서 그 안에 몇번째인지 찾으려 했다.
위의 예를 들면 k=17인데, 13위에 있다. 그래서 먼저 13을 찾고 13 중에서 2번째니깐 3을 출력!
그래서 일을 나눠보면 이렇다
1.
- 각 자리수의 마지막 index를 구한다. (한자리는 9, 두자리는 189)
- 이건 반복문을 돌려가면서 sum을 구한다
- sum += 90 * 2자리 : 이건 몇 번째인지 위에 나와있음... . ...
-
2.
- 만약 k가 두자리라면 두자리 중 몇 번쨰에 위치하고 있는가 확인
- k가 있는 수는 무엇인가
- k의 이전 숫자의 마지막 인덱스는 무엇인가
- k가 수의 몇 번째 인덱스에 있는가
이런 복자아아압한 방법으로 구했는데 틀렸다. ;ㅁ;
근데 맑은 정신으로 보면 다시 풀릴 것 같다. 막 어려운 개념 이런 건 아니니깐.. 아무튼 이걸 3시간 동안 붙잡고 있어서 지금은 다시 보기 싫다. 와우! 세시간이라니! 코포 1솔브도 못하고 끝냈겠다.
수 이어 쓰기 2가 있으니 수 이어 쓰기 1도 있을 것 같아 1을 풀려 했다. 아니 근데 이건 수가 3000자리!
'백준' 카테고리의 다른 글
15885 고장난 시계 (0) | 2019.11.23 |
---|---|
1252 이진수 덧셈 (0) | 2019.11.23 |
1059 수2 (0) | 2019.11.17 |
7795 먹을 것인가 먹힐 것인가 (0) | 2019.11.17 |
6236 용돈관리 (미완) (0) | 2019.11.10 |