본문 바로가기

백준

1790 수 이어 쓰기2 (미완)

#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