static void Main(string[] args)
{
short x1, x2, y1, y2, r1, r2;
short test_case = short .Parse(System.Console.In.ReadLine());
while (test_case != 0)
{
string pos_input = System.Console .In.ReadLine();
string[] pos_array = pos_input.Split();
x1 = short.Parse(pos_array[0]);
y1 = short.Parse(pos_array[1]);
r1 = short.Parse(pos_array[2]);
x2 = short.Parse(pos_array[3]);
y2 = short.Parse(pos_array[4]);
r2 = short.Parse(pos_array[5]);
double distance = Math .Sqrt(Math.Pow(x1 - x2, 2) + Math.Pow(y1 - y2, 2));
if (distance == 0 && r1 == r2)
{
System. Console.Out.WriteLine(-1);
}
else if (distance < Math.Abs(r1 - r2))
{
System. Console.Out.WriteLine(0);
}
else if (distance == Math.Abs(r1 - r2))
{
System. Console.Out.WriteLine(1);
}
else if (distance < r1 + r2)
{
System. Console.Out.WriteLine(2);
}
else if (distance == r1 + r2)
{
System. Console.Out.WriteLine(1);
}
else if (distance > r1 + r2)
{
System. Console.Out.WriteLine(0);
}
test_case--;
}
}
[문제]
https://www.acmicpc.net/problem/1002
[풀이]
중학교 때 풀던 수학문제를 생각 하면 된다
두 점이 주어지고 각 점에서의 거리 r이 각각 주어졌으므로, 두 점을 중심으로 하고 각각 r을 반지름으로 하는 두 원이 몇 개의 점에서 만나는지 찾으면 된다.
경우의 수는 총 6가지.
1.두 원이 일치하는 경우
d = 0 이고 r1 = r2 가 같다. 이 경우 무한한 경우의 수가 나오므로 -1 리턴
2.작은 원이 큰 원 안에 속해 있고, 테두리가 접하지 않는 경우
r1 - r2 의 절대값이 d 보다 크다. 즉,
이 경우 두 원이 만나지 않으므로 경우의 수는 0이다.
3.작은 원이 큰 원 안에 속해 있고, 한 점에서 접해있는 경우
r1 - r2의 절대값이 d와 같다. 즉,
이 경우 근의 수가 1이므로 경우의 수 역시 1이다.
4.두 원이 두 점에서 만나는 경우
r1 + r2 가 d 보다 큰 경우이다. 이 경우 원은 두 점에서 만난다. 즉,
이 경우 근의 개수가 2이므로 경우의 수도 2.
5.두 원이 겹치지 않고, 한 점에서 만나는 경우
한 점에서 만나므로 1 리턴.
6.두 원이 만나지 않는 경우
근이 없으므로 0 리턴.
=> 수학적 능력 보다는 해당 문제를 보고 두 원의 관계에 대한 접근으로 다가갈 수 있느냐를 판단하는 문제 인듯.
'100.알고리즘 > 01. Baekjoon Online' 카테고리의 다른 글
[Baekjoon online] 1004번 문제 - 어린 왕자 (0) | 2016.07.14 |
---|---|
[Baekjoon online] 1003번 문제 - 피보나치 함수 (0) | 2016.07.14 |
[Baekjoon online] 1001번 문제 - A-B (0) | 2016.07.14 |
[Baekjoon online] 1000번 문제 - A+B (0) | 2016.07.14 |