PS

BOJ 1002 - 터렛

728x90

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

 

1002번: 터렛

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

www.acmicpc.net

 

두 원 사이의 교점의 갯수를 구하는 문제로

공식을 알고 있으면 풀 수 있는 문제다

 

두 원의 중심좌표간 거리를 s 라 할때,  s 는 아래의 식으로 구해진다.

 

 

그리고 두 원 사이의 교점의 갯수는

 

1. 두 원의 중심좌표가 서로 같은 경우 (x2 == x1 && y2 == y1)

  -1) r1 != r2 이면 교차하는 점의 갯수가 0

  -2) r1 == r2 이면 교차하는 점의 갯수가 원이므로 무한대

 

2. 1이 아닐때

 -1) abs(r1 - r2) < s && s < r1 + r2 이면 교차하는 점의 갯수가 2개

 -2) abs(r1 - r2) == s || s == (r1 + r2) 이면 교차하는 점의 갯수가 1개

 -3) r1 + r2 < s 일때 교차하는 점의 갯수가 0 개 이다.

 

 

이점에 유의하여 코드를 작성하면 통과한다.

 

- c++

#include <iostream>
#include <cmath>
 
using namespace std;
 
int main()
{
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);
 
    int T, x1, y1, r1, x2, y2, r2;
    double s;
 
    cin >> T;
 
    while (T--) {
        cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
        s = sqrt(pow(x1 - x2, 2+ pow(y1 - y2, 2));
 
        if (x1 == x2 && y1 == y2) {
            if (r1 == r2) {
                cout << -1 << '\n';
            }
            else {
                cout << 0 << '\n';
            }
        }
        else if (abs(r1 - r2) < s && s < r1 + r2) {
            cout << 2 << '\n';
        }
        else if (abs(r1 - r2) == s || s == r1 + r2) {
            cout << 1 << '\n';
        }
        else {
            cout << 0 << '\n';
        }
    }
 
    return 0;
}
cs

 

 

 

728x90

'PS' 카테고리의 다른 글

BOJ 2042 - 구간 합 구하기  (0) 2020.08.11
BOJ 2309 - 일곱 난쟁이  (0) 2020.08.11
BOJ 1759 - 암호 만들기  (0) 2020.08.05
BOJ 3613 - Java vs C++  (0) 2020.08.02
BOJ 1919 - 애너그램 만들기  (0) 2020.08.02