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
'Algorithm > 수학' 카테고리의 다른 글
[백준][1978번][수학] 소수찾기 (0) | 2016.03.27 |
---|---|
[백준][1446번][수학] 지름길 (0) | 2016.03.23 |
[백준][1788번][수학] 피보나치 수의 확장 (0) | 2016.03.23 |
[백준][1735번][유클리드 호제법] 분수 합 (0) | 2016.03.23 |
[백준][1057번][수학] 토너먼트 문제 (0) | 2016.03.22 |
댓글