문제 링크입니다: https://www.acmicpc.net/problem/1002
기하학 알고리즘 문제였습니다.
크게는 2가지 경우의 수, 작게는 7가지 경우의 수를 고려하면 되는 문제였습니다.
2차원 평면에서 점과 점 사이의 거리 공식은 워낙 유명하기 때문에 설명을 생략하겠습니다.
1. 한 원의 중심이 다른 원 안에 있는 경우
a) 동일 원인 경우
b) 접점이 없는 경우(작은 반지름 + 두 중심 사이의 거리 < 큰 반지름)
c) 접점이 하나인 경우(작은 반지름 + 두 중심 사이의 거리 = 큰 반지름)
d) 접점이 두개인 경우(작은 반지름 + 두 중심 사이의 거리 > 큰 반지름)
2. 각 원의 중심이 다른 원 안에 없는 경우
a) 접점이 없는 경우(작은 반지름 + 큰 반지름 < 두 중심 사이의 거리)
b) 접점이 하나인 경우(작은 반지름 + 큰 반지름 = 두 중심 사이의 거리)
c) 접점이 두개인 경우(작은 반지름 + 큰 반지름 > 두 중심 사이의 거리)
물론, 기하 문제는 언제나처럼 말로 설명하는 것보다 직접 그려보는 것이 이해하는데 도움이 됩니다.
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int x, y, r;
int x2, y2, r2;
pair<int, int> coord1, coord2;
double getDistance(void)
{
//기본 공식
return sqrt(pow(coord2.first - coord1.first, 2.0) + pow(coord2.second - coord1.second, 2.0));
}
void printContactNum(void)
{
double distance = getDistance();
int shortR = min(r, r2); //짧은 반지름
int longR = max(r, r2); //긴 반지름
if (distance <= longR) //원 안에 다른 원의 중심이 있는 경우
{
if (coord1 == coord2 && r == r2) //두 원 동일
cout << -1 << endl;
else if (distance + shortR < longR) //접점이 없는 경우
cout << 0 << endl;
else if (distance + shortR == longR) //하나의 접점
cout << 1 << endl;
else if (distance + shortR > longR) //두 개의 점점
cout << 2 << endl;
}
else
{
if (distance > longR + shortR) //접점이 없는 경우
cout << 0 << endl;
else if (distance == longR + shortR) //한개의 접점
cout << 1 << endl;
else if (distance < longR + shortR) //두개의 접점
cout << 2 << endl;
}
}
int main(void)
{
int test_case;
cin >> test_case;
for (int i = 0; i < test_case; i++)
{
cin >> x >> y >> r >> x2 >> y2 >> r2;
coord1 = make_pair(x, y); //규현
coord2 = make_pair(x2, y2); //승환
printContactNum();
}
return 0;
}
개발환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
*Visual Studio 2017에서 변수명을 y1으로 쓰면 C2365 에러가 뜹니다. 이유를 모르겠습니다...
*cmath 헤더파일에 y1 함수가 존재하기 때문에 C2365 에러가 뜨는거였습니다.
'알고리즘 > BOJ' 카테고리의 다른 글
백준 1037번 약수 (2) | 2018.05.04 |
---|---|
백준 1004번 어린 왕자 (0) | 2018.05.01 |
백준 14926번 Not Equal (0) | 2018.05.01 |
백준 1085번 직사각형에서 탈출 (0) | 2018.04.30 |
백준 2178번 미로 탐색 (2) | 2018.04.29 |