6064번 - 카잉 달력
규칙을 찾아서 풀면 간단하게 풀 수 있는 문제였다.
처음에 나는 규칙을 찾았지만, 같은 규칙을 아주 복잡하게 구해서 문제를 푸는데 어려움을 겪었다.
규칙을 간단하게 말하면,
둘 중 하나의 숫자에 맞춰놓고, 칸을 옮겨가면서 있는지만 확인하면 된다. 이때 MAX값은 두 길이의 최소공배수가 된다.
그래서 최소공배수는 유클리드 호제법을 이용한 최대공약수를 이용해서 풀었다.
(유클리드 스펠링이 사실 uclid 가 아님)
<정답 코드>
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 51 52 53 54 55 56 57 58 59 60 61 62 | #include<iostream> #include<string.h> using namespace std; int uclid(int x, int y) { if (y == 0) { return x; } else { return uclid(y, x % y); } } int main() { int tc; scanf("%d", &tc); while (tc--) { int n, m, n1, m1; scanf("%d%d%d%d", &n, &m, &n1, &m1); int MAX = n*m / uclid(n, m); int x = 1, y = 1; int cnt = 1; while (cnt<=MAX) { if (x < n1) { x++; y++; cnt++; if (x > n)x -= n; if (y > m)y -= m; } if (x == n1 && y!=m1) { cnt += n; y += n; while (y > m) { y -= m; } } if (x == n1 && y == m1) { break; } } if (cnt > MAX) { cnt = -1; } printf("%d\n", cnt); } return 0; } | cs |
반응형