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 |