본문 바로가기
Algorithm/수학

[백준][1790번][수학] 수 이어 쓰기 2

by 우툴 2016. 3. 22.
728x90

수 이어 쓰기 2

https://www.acmicpc.net/problem/1790

<내가 푼 코드>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
 
int main(void){
    
    long long N, K, calK;
    long long totalnum = 0;    
    long long numcount = 9;
    long long numlength=1;
    long long tenten=1;
    long long result;
    
    scanf("%lld %lld", &N, &K);
    calK = K;
 
    while (calK > numcount*numlength){
        totalnum += numcount;
        calK -= numcount*numlength;
        numcount *= 10;
        numlength++;
    }
 
    totalnum += (calK-1/ numlength+1;
 
    if (totalnum > N)
        result = -1;
    else{    
        long long temp = (calK-1)%numlength +1;
    
        for (int i = 0; i < numlength - 1; i++)
            tenten *= 10;
 
        for (int i = 0; i < temp; i++)
        {
            result = totalnum / tenten;
            totalnum %= tenten;
            tenten /= 10;
        }
    }
    
    printf("%d\n", result);
 
 
    return 0;
}
cs


< 문제 푼 요령 >

1. 모든 숫자를 다 집어넣어서 노가다로 구하면 타임 리밋 or 런타임 에러가 날 것 같다.

2. 자릿수가 증가하는 영역을 설정해서 생략을 시켜 줄 수 있다.

 ex)  - 1의 자리 : 9개          글자수 :1개

 - 10의 자리 : 90개         글자수 : 2개

 - 100의 자리 : 900개       글자수 : 3개 ............... 

위의 법칙대로 자리수가 증가하면 10개가 오르고 글자수는 하나씩 오르는 것을 발견할 수 있다.

3. 최대한 생략할 수 있는 자리수 까지 구하면 그 생략한 수 까지의 얼마나 수가 지나쳤는지 알수 있다. 그러면 그 다음부터 K자리수의 숫자에서 글자수를 나눈다면 이게 숫자가 몇인줄 알 수 있다.

 ex) K 200 -> 10의 자리까지 생략가능 1 x 9 + 90 x 2 =189 나머지 K의 값 11 즉 여기서 (11-1)/ 3(글자수)  3개 나머지 1 

 즉 가르키고 있는 숫자는 100 + 3 인 '103'가 된다.

4. 3번에서 나눴을 때 나머지를 가지고 자릿수를 알 수 있다. 그 숫자의 몇번째 숫자인줄 알 수 있다. 즉 출력하면 된다. 

 ex) K 200 -> 103 이고 나머지가 1 이였다.즉 0이면 첫번째 1 이면 2번째 2이면 3번째 수이므로 여기서 나머지가 1인 것으로 '0' 이란걸 알 수 있다.

728x90

댓글