본문 바로가기

백준

백준1002 - 터렛

https://www.acmicpc.net/problem/1002

 

1002번: 터렛

각 테스트 케이스마다 류재명이 있을 수 있는 위치의 수를 출력한다. 만약 류재명이 있을 수 있는 위치의 개수가 무한대일 경우에는 -1을 출력한다.

www.acmicpc.net

원의 관계에 따라 생성되는 교점에 수를 묻는 문제였다. 나는 총 7가지로 가정하고 문제를 풀었다.

 

 

 

1. 두 원이 만나지 않은 경우 : (r1 + r2) ^ 2 < (x1 - x2) ^ 2 + (y1 - y2) ^ 2

 

 

2. 두 원이 외접하는 경우 : (r1 + r2) ^ 2 = (x1 - x2) ^ 2 + (y1 - y2) ^ 2

 

 

3. 두 원이 내접하는 경우 : (r1 - r2) ^ 2 = (x1 - x2) ^ 2 + (y1 - y2) ^ 2

 

 

4. 두 원이 동심원인 경우 : x1 == x2 ,y1 == y2, r1 != r2

 

 

5. 두 원이 동일한 경우 : x1 == x2 ,y1 == y2, r1 == r2

 

 

6. 두 원이 동심원을 제외한 포함 관계에 있는 경우 :  (r1 - r2) ^ 2 > (x2 - x1) ^ 2 + (y2 - y1) ^ 2

 

 

7. 두 원이 두 점에서 만나는 경우 : (r1 + r2) ^ 2 > (x1 - x2) ^ 2 + (y1 - y2) ^ 2

 

 

 

한 가지 주의할 것은 동일원과 동심원일 때 비교하는 조건을 내접하는 조건과 외접하는 조건보다 위에 적어야 한다는 것이다. 이 점만 지켜준다면 해결할 수 있다.

#include <iostream>
#include <cmath>
using namespace std;

int main() {
	int x1, x2, y1, y2, r1, r2;
	int n;

	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
		if (pow((r1 + r2), 2) < pow(x1 - x2, 2) + pow(y1 - y2, 2)) { //만나는 점이 없는 경우
			cout << 0 << '\n';
		}
		else if (x1 == x2 && y1 == y2 && r1 == r2) { //동일 원인 경우
			cout << -1 << '\n';
		}
		else if (x1 == x2 && y1 == y2 && r1 != r2) { //동심 원인 경우
			cout << 0 << '\n';
		}
		else if (pow((r1 + r2), 2) == pow(x1 - x2, 2) + pow(y1 - y2, 2)) { //외접하는 경우
			cout << 1 << '\n';
		}
		else if (pow((r1 - r2), 2) == pow(x1 - x2, 2) + pow(y1 - y2, 2)) { //내접하는 경우
			cout << 1 << '\n';
		}
		else if (pow((r1 - r2), 2) > pow(x1 - x2, 2) + pow(y1 - y2, 2)) { //동심원을 제외한 원 안에 원이 있는 경우
			cout << 0 << '\n';
		}
		else { //두 점에서 만나는 경우
			cout << 2 << '\n';
		}
	}
}

'백준' 카테고리의 다른 글

백준2596 - 비밀편지  (0) 2019.12.02
백준17265 - 나의 인생에는 수학과 함께  (0) 2019.12.01
백준1092 - 배  (0) 2019.11.25
백준2622 - 삼각형만들기  (0) 2019.11.23
백준10164 - 격자상의 경로  (0) 2019.11.20