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 45 46 47 48 49 50 | #include <stdio.h> #define SQUARE(X) ((X)*(X)) int run(); long long warp(long long d); int main() { return run(); } int run() { int num; long long x, y; scanf("%d", &num); while (--num) { scanf("%lld %lld", &x, &y); printf("%lld\n", warp(y - x)); } return 0; } long long warp(long long d) { long long j; long long min, sqr, max; for (j = 1; ; ++j) { sqr = SQUARE(j); min = sqr - (j - 1); max = sqr + j; if ((min <= d) && (d <= sqr)) { return ((j << 1) - 1); } else if ((sqr < d) && (d <= max)) { return (j << 1); } } } | cs |
거리마다 공간 이동 장치 작동 횟수는 다음과 같다.
거리 | 이동 단계(거리) |
공간 이동 장치 작동 횟수 |
1 | 1 | 1 |
2 | 1 - 1 |
2 |
3 | 1 - 1 - 1 |
3 |
4 | 1 - 2 - 1 |
3 |
5 | 1 - 2 - 1 - 1 |
4 |
6 | 1 - 2 - 2 - 1 |
4 |
7 | 1 - 2 - 1 - 2 - 1 |
5 |
8 | 1 - 2 - 2 - 2 - 1 |
5 |
9 | 1 - 2 - 3 - 2 - 1 |
5 |
10 | 1 - 2 - 2 - 2 - 2 - 1 |
6 |
11 | 1 - 2 - 3 - 2 - 2 - 1 |
6 |
12 | 1 - 2 - 3 - 3 - 2 - 1 |
6 |
13 | 1 - 2 - 3 - 3 - 2 - 1 - 1 |
7 |
14 | 1 - 2 - 3 - 3 - 2 - 2 - 1 |
7 |
15 | 1 - 2 - 3 - 3 - 3 - 2 - 1 |
7 |
16 | 1 - 2 - 3 - 4 - 3 - 2 - 1 |
7 |
17 | 1 - 2 - 3 - 4 - 3 - 2 - 1 - 1 |
8 |
18 | 1 - 2 - 3 - 4 - 3 - 2 - 2 - 1 |
8 |
19 | 1 - 2 - 3 - 4 - 3 - 3 - 2 - 1 |
8 |
20 | 1 - 2 - 3 - 4 - 4 - 3 - 2 - 1 |
8 |
21 | 1 - 2 - 3 - 4 - 4 - 3 - 2 - 1 - 1 |
9 |
22 | 1 - 2 - 3 - 4 - 4 - 3 - 2 - 2 - 1 |
9 |
23 | 1 - 2 - 3 - 4 - 4 - 3 - 3 - 2 - 1 |
9 |
24 | 1 - 2 - 3 - 4 - 4 - 4 - 3 - 2 - 1 |
9 |
25 | 1 - 2 - 3 - 4 - 5 - 4 - 3 - 2 - 1 |
9 |
26 | 1 - 2 - 3 - 4 - 5 - 4 - 3 - 2 - 1 - 1 | 10 |
27 | 1 - 2 - 3 - 4 - 5 - 4 - 3 - 2 - 2 - 1 | 10 |
28 | 1 - 2 - 3 - 4 - 5 - 4 - 3 - 3 - 2 - 1 | 10 |
29 | 1 - 2 - 3 - 4 - 5 - 4 - 4 - 3 - 2 - 1 | 10 |
30 | 1 - 2 - 3 - 4 - 5 - 5 - 4 - 3 - 2 - 1 | 10 |
31 | 1 - 2 - 3 - 4 - 5 - 5 - 4 - 3 - 2 - 1 - 1 | 11 |
규칙은 다음과 같다.
① 거리는 제곱수 (n², n=1, 2, 3, …) 를 기준으로 양쪽으로 일정 범위에 속하게 된다.
② 거리가 [n² - (n - 1), n²] 일 경우 공간 이동 장치 작동 횟수는 2n - 1 이고,
거리가 [n², n²+n] 일 경우 공간 이동 장치 작동 횟수는 2n 이다.
이를 그대로 코드에 옮기면 된다.
j 를 1 부터 시작해 1 씩 늘리며, 주어진 거리가 각 구간에 속하는지 검사한다.
그런데 왜 long long 을 int 로 바꾸면 시간 초과가 발생하는 걸까..
: 2019/04/08
32bit OS에서는 int형(4byte)이 제일 빠르니까 64bit에서는 long long형(8byte)이 제일 빠른 게 아닐까 싶다.
'Programming > Solutions' 카테고리의 다른 글
[Project Euler] Problem 010 (0) | 2019.03.31 |
---|---|
[Project Euler] Problem 009 (0) | 2019.03.30 |
[Project Euler] Problem 008 (0) | 2019.03.25 |
[BAEKJOON] 1152번 (0) | 2019.03.25 |
[BAEKJOON] 2775번 (0) | 2019.03.25 |