1002번: 터렛

1002번: 터렛

1002번: 터렛 클릭시 문제로 이동

1) 문제


2) 문제 설명 


조규현백승환의 위치와 조규현마린의 거리, 백승환마린의 거리가 주어진다.

이때 마린이 있을 수 있는 위치의 수는 ?


3) 풀이 과정


조규현백승환의 위치를 좌표평면상에 (x1, y1), (x2, y2)로 표현하고

조규현마린의 거리를 r1, 백승환마린의 거리를 r2라고하면

원점이 x1, y1이고 반지름이 r1인 원

원점이 x2, y2이고 반지름이 r2인 원

각각 조규현이 계산한 마린, 백승환이 계산한 마린이 있을 수 있는 위치이다.

즉, 두 원의 관계를 계산하면 마린이 있을 수 있는 위치를 구할 수 있다.


4) 핵심



5) 핵심 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (x1 == x2 && y1 == y2 && r1 == r2)  
{   
    cout << -1 << endl;   
    return;
}
int distanceSquare = pow(x1 - x2, 2+ pow(y1 - y2, 2); // 거리의 제곱  
int sumOfRadiusSquare = pow(r1 + r2, 2);                // 반지름 합의 제곱  
int subOfRadiusSquare = pow(r1 - r2, 2);                // 반지름 차의 제곱
 
if (distanceSquare > sumOfRadiusSquare || distanceSquare < subOfRadiusSquare)   
    cout << 0 << endl;  
else if (distanceSquare == sumOfRadiusSquare || distanceSquare == subOfRadiusSquare)   
    cout << 1 << endl;  
else if (distanceSquare > subOfRadiusSquare && distanceSquare < sumOfRadiusSquare)   
    cout << 2 << endl;
cs

6) 기타

핵심 코드에서 distance(거리) 대신해서 distanceSquare(거리의 제곱)로 계산을 하였다.

그 이유는 두 점의 거리를 계산할 때 피타고라스의 정리를 이용하여

(x1 - x2)² + (y1 - y2)² = d²

즉 d = sqrt((x1 - x2)² + (y1 - y2)²)

그런데 프로그래밍이나 수학에서 제곱근을 구하는 연산은 오래걸린다.

이때 a > b > 0 이면 a² > b² > 0 이라는 것을 이용하여

distance를 제곱하고 비교할 대상을 제곱해서 비교하면

두 수의 대소관계를 구할 수 있는 것이다.



주저리 주저리

필체, 변수명 짓기, 설명 셋 다 못해서 문제다 ㅠ

일주일에 한두개씩은 알고리즘 문제를 올리려고 한다.

설명의 난이도는 누구나 봐도 이해할 수 있게 하려고 하는데 잘될지는 의문이다.

옛날부터 설명을 못한다고 생각하고 있었기 때문에

자주 글을 올리다 보면 나아지겠지?

이번기회에 잘하게 되면 좋겠다 :3

'Training > Acmicpc' 카테고리의 다른 글

1475번: 방 번호  (0) 2017.08.31
1297번: TV 크기  (0) 2017.08.17
8741번: 이진수의 합  (0) 2017.08.12