<답안>
#include <iostream>
#include <cmath>
using namespace std;
void swap(double *r1, double *r2)
{
double temp = *r1;
*r1 = *r2;
*r2 = temp;
}
int main()
{
int t;
int x1,x2,y1,y2;
double r1,r2;
double distance;
cin>>t;
while(t-- > 0)
{
cin>>x1>>y1>>r1>>x2>>y2>>r2;
distance = sqrt(pow(x1-x2,2)+pow(y1-y2,2));
if(distance > r1+r2)
cout<<0;
else if(distance == r1+r2)
cout<<1;
else
{
if(r1 < r2)
swap(&r1,&r2);
if(distance > r1-r2)
cout<<2;
else if(distance != 0 && distance == r1-r2)
cout<<1;
else if(distance != 0 && distance < r1 - r2)
cout<<0;
else if(distance == 0 && r1 != r2)
cout<<0;
else
cout<<-1;
}
cout<<"\n";
}
return 0;
}
<설명>
이 문제는 문제접근 방법은 쉽게 떠올랐다 두점간의 거리와 반지름간에 비교를 통해 2점인지 1점인이 안만나는지 같은 원의 경우 -1를 구하면 되겠다 정도는 쉽게 떠올랐다
하지만 경우를 쪼개는게 생각보다 쉽게풀리지만은 않았다
크게 생각했을때 7가지의 케이스가 생겼었다
두점의 거리를 distance 라고 하였을 때
1. if (distance > r1+r2)
-> 0, 만나지 않는 경우이다
2. if (distance == r1+r2)
-> 1, 밖에서 한점으로 만나는 경우이다
else : distance < r1+r2인 경우이다
swap() : r1과 r2를 비교하여 큰 값을 r1으로 바꾼다
3. if (distance > r1-r2)
-> 2, 내부에서 두점으로 겹치는 경우이다
4. if (distance == r1-r2)
-> 1, 내부에서 한점으로 겹치는 경우이다
여기서 주의할 점은 위의 경우에 distance = 0, r1 = r2, 즉 동일한 원인 경우도 포함된다
동일원일때는 -1이 출력되어야 하기 때문에 위의 조건에서 수정이 필요하다
그래서 distance != 0 조건을 추가한다
4. if (distance != 0 && distance == r1-r2)
-> 1, 내부에서 한점으로 겹치는 경우이다
5. if (distance != 0 && distance < r1-r2)
-> 0, 내부에서 만나지 않는 경우이다
이외에 남은 두 케이스는 좌표가 동일한 경우이다
이중에 동일원인 경우(r1 == r2)와 동일하지 않는 경우(r1 != r2)로 나뉜다
6. if(distance == 0 && r1 != r2)
-> 0, 동일좌표, 동일원이 아니기에 만나지 않는 경우이다
7. else (distance == 0 && r1 == r2)
-> -1, 동일 원이기에 -1을 출력한다
각 케이스에 맞게 출력한 다음 개행하여 다음 입력을 진행한다
'백준 > 백준 단계별 문제풀이' 카테고리의 다른 글
백준 3053번 (C++) (0) | 2020.09.01 |
---|---|
백준 4153번 (C++) (0) | 2020.08.30 |
백준 3009번 (C++) (0) | 2020.08.30 |
백준 1085번 (C++) (0) | 2020.08.30 |
백준 9020번 (C++) (0) | 2020.08.30 |