[백준 1002] 터렛 (C#, C++) - soo:bak
작성일 :
문제 링크
설명
터렛의 중심 좌표
와 상대편 까지의 거리
가 주어졌을 때, 상대편이 있을 수 있는 위치의 개수를 계산하는 문제입니다.
이 문제는 두 원의 교점의 개수를 찾는 문제로 볼 수 있습니다.
즉, 두 원의 중심 사이의 거리
와 각 원의 반지름(상대편 까지의 거리)
을 비교함으로써 상대편이 있을 수 있는 위치의 개수를 결정할 수 있습니다.
-
두 원의 중심 좌표가 같고 반지름이 같은 경우 : 가능한 위치는 무한대입니다.
-
두 원의 중심 사이의 거리가 다른 원의 반지름과 같거나 작은 경우 : 하나의 위치만 가능합니다.
-
두 원의 중심 사이의 거리가 두 원의 반지름의 합보다 큰 경우 : 가능한 위치가 없습니다.
-
두 원의 중심 사이의 거리가 두 원의 반지름의 합과 같은 경우 : 하나의 위치만 가능합니다.
-
그 외의 경우, 두 원은 두 점에서 만나게 되므로 가능한 위치는 두 개 입니다.
입력으로 주어지는 각 원의 중심 좌표와 반지름을 통하여, 위에서 언급한 각 경우에 대하여 검사한 후 가능한 위치의 개수를 출력합니다.
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;
}