BOJ 1002 - 터렛

image.png

이 문제 재채점되고 $4$년전 풀이가 틀려있어서 당황스러웠다.

아마 실수오차때문이거나 $r_1=0, r_2=0$ 이고 위치가 같을 때 $-1$ 을 출력하는게 아닌 점이기 때문에 $1$ 을 출력해야 하는 엣지 케이스가 제대로 처리가 안된 것 같다.

실수 연산을 안쓰고 항상 정수 연산으로 대체할 수 있다.

int sq(int x) { return x * x; }
void solve() {
   int x1, y1, r1, x2, y2, r2;
   cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
   if (r1 > r2) swap(r1, r2), swap(x1, x2), swap(y1, y2);

   int dx = x1 - x2, dy = y1 - y2;
   int d = dx * dx + dy * dy;

   if (x1 == x2 && y1 == y2) {
      if (r1 == r2) {
         if (r1 == 0) cout << 1 << endl;
         else cout << -1 << endl;
      } else cout << 0 << endl;
      return;
   }
   if (r1 == 0 && r2 == 0) {
      cout << 0 << endl;
      return;
   }

   if (d > sq(r1 + r2)) {
      cout << 0 << endl;
      return;
   }
   if (d == sq(r1 + r2)) {
      cout << 1 << endl;
      return;
   }

   if (d == sq(r2 - r1)) {
      cout << 1 << endl;
      return;
   }
   if (d < sq(r2 - r1)) {
      cout << 0 << endl;
      return;
   }

   cout << 2 << endl;
}

Tags:

Categories:

Updated:

Comments