문제
풀이
int t;
cin>>t;
먼저 테스트케이스의 갯수 T를 입력받습니다.
int x1,y1,r1,x2,y2,r2;
for (int i = 0; i < t; i++)
{
cin>>x1>>y1>>r1>>x2>>y2>>r2;
double distance=sqrt(pow(x1-x2,2)+pow(y1-y2,2));
...
x1,y1,r1 x2,y2,r2값을 입력받고, 두 원의 중심 사이의 거리를 distance에 저장합니다.
//원이 겹칠떄
if (distance == 0 && r1 == r2)
cout << -1<<"\n";
원이 겹칠때 교점이 무한개이므로 -1을 출력합니다.
//원이 한점에서 만날때
else if (distance == r1 + r2 || distance + (r1 > r2 ? r2 : r1) == (r1 > r2 ? r1 : r2))
cout << 1<<"\n";
distance ==r1+r2 는 왼쪽의 상황,
distance + (r1 > r2 ? r2 : r1) == (r1 > r2 ? r1 : r2) 는 오른쪽의 상황을 의미합니다.
//원이 아예 안만날때
else if (distance > r1 + r2 || distance + (r1 > r2 ? r2 : r1) < (r1 > r2 ? r1 : r2))
cout << 0<<"\n";
distance > r1 + r2는 왼쪽 상황
distance + (r1 > r2 ? r2 : r1) < (r1 > r2 ? r1 : r2)는 오른쪽 상황입니다.
이때 원이 완전히 겹치는 경우에도 distance + (r1 > r2 ? r2 : r1) < (r1 > r2 ? r1 : r2) 이 조건문에 걸리게되는데,
앞서서 원이 겹치는건 if문으로 먼저 처리를 해주었기 때문에 따로 처리를 해주지 않아도 됩니다.
//원이 2점에서 만날때
else
cout << 2<<"\n";
그 외 나머지 상황은 원이 2점에서 만나는 것이기때문에 2를 출력해줍니다.
이 과정을 테스트케이스 t만큼 반복해주면 됩니다.
#include<iostream>
#include<cmath>
#include<math.h>
using namespace std;
int main()
{
int t;
cin>>t;
int x1,y1,r1,x2,y2,r2;
for (int i = 0; i < t; i++)
{
cin>>x1>>y1>>r1>>x2>>y2>>r2;
double distance=sqrt(pow(x1-x2,2)+pow(y1-y2,2));
//원이 겹칠떄
if (distance == 0 && r1 == r2)
cout << -1<<"\n";
//원이 한점에서 만날때
else if (distance == r1 + r2 || distance + (r1 > r2 ? r2 : r1) == (r1 > r2 ? r1 : r2))
cout << 1<<"\n";
//원이 아예 안만날때
else if (distance > r1 + r2 || distance + (r1 > r2 ? r2 : r1) < (r1 > r2 ? r1 : r2))
cout << 0<<"\n";
//원이 2점에서 만날때
else
cout << 2<<"\n";
}
}
최종코드입니다.
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[C++] 하키(1358번) (0) | 2022.09.09 |
---|---|
[C++] 어린 왕자(1004번) (0) | 2022.09.08 |
[C++] 백준-택시 기하학(3053번) (0) | 2022.09.05 |
[C++] 백준-참외밭(2477번) (0) | 2022.09.01 |
[C++] 백준-직각삼각형(4153번) (0) | 2022.08.31 |