작성일 :

문제 링크

1002번 - 터렛

설명

터렛의 중심 좌표상대편 까지의 거리 가 주어졌을 때, 상대편이 있을 수 있는 위치의 개수를 계산하는 문제입니다.

이 문제는 두 원의 교점의 개수를 찾는 문제로 볼 수 있습니다.

즉, 두 원의 중심 사이의 거리각 원의 반지름(상대편 까지의 거리) 을 비교함으로써 상대편이 있을 수 있는 위치의 개수를 결정할 수 있습니다.


  • 두 원의 중심 좌표가 같고 반지름이 같은 경우 : 가능한 위치는 무한대입니다.

  • 두 원의 중심 사이의 거리가 다른 원의 반지름과 같거나 작은 경우 : 하나의 위치만 가능합니다.

  • 두 원의 중심 사이의 거리가 두 원의 반지름의 합보다 큰 경우 : 가능한 위치가 없습니다.

  • 두 원의 중심 사이의 거리가 두 원의 반지름의 합과 같은 경우 : 하나의 위치만 가능합니다.

  • 그 외의 경우, 두 원은 두 점에서 만나게 되므로 가능한 위치는 두 개 입니다.


입력으로 주어지는 각 원의 중심 좌표와 반지름을 통하여, 위에서 언급한 각 경우에 대하여 검사한 후 가능한 위치의 개수를 출력합니다.


Code

[ C# ]

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
namespace Solution {
  class Program {
    static void Main(string[] args) {

      var cntCase = int.Parse(Console.ReadLine()!);
      for (int c = 0; c < cntCase; c++) {
        var input = Console.ReadLine()!.Split(' ');
        var x1 = int.Parse(input[0]);
        var y1 = int.Parse(input[1]);
        var r1 = int.Parse(input[2]);
        var x2 = int.Parse(input[3]);
        var y2 = int.Parse(input[4]);
        var r2 = int.Parse(input[5]);

        var distSqrd = Math.Pow(x2 - x1, 2) + Math.Pow(y2 - y1, 2);
        var sumRadSqrd = Math.Pow(r1 + r2, 2);
        var diffRadSqrd = Math.Pow(r1 - r2, 2);

        if (distSqrd == 0) {
          if (r1 == r2) Console.WriteLine(-1);
          else Console.WriteLine(0);
        } else if (distSqrd == sumRadSqrd || distSqrd == diffRadSqrd)
          Console.WriteLine(1);
          else if (distSqrd > diffRadSqrd && distSqrd < sumRadSqrd)
          Console.WriteLine(2);
          else Console.WriteLine(0);
      }

    }
  }
}



[ C++ ]

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
#include <bits/stdc++.h>

using namespace std;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int cntCase; cin >> cntCase;
  for (int c = 0; c < cntCase; c++) {
    int x1, y1, r1, x2, y2, r2;
    cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;

    int distSqrd = pow(x2 - x1, 2) + pow(y2 - y1, 2);
    int sumRadSqrd = pow(r1 + r2, 2);
    int diffRadSqrd = pow(r1 - r2, 2);

    if (distSqrd == 0) {
      if (r1 == r2) cout << "-1\n";
      else cout << "0\n";
    } else if (distSqrd == sumRadSqrd || distSqrd == diffRadSqrd)
      cout << "1\n";
      else if (distSqrd > diffRadSqrd && distSqrd < sumRadSqrd)
      cout << "2\n";
      else cout << "0\n";
  }

  return 0;
}