본문 바로가기

알고리즘/문제풀이

[BOJ/1002] 터렛(C++)

설계

평면상의 좌표가 주어지고, 해당 좌표에서 거리가 주어지는데, 여기서 좌표는 원의 중심, 거리는 반지름으로 생각하면 된다. 

즉, 문제에서 류재명이 있을 수 있는 좌표는 

1. 조규현을 원의 중심으로 생각했을 때 그릴 수 있는 원

2. 백승환을 원의 중심으로 생각했을 때 그릴 수 있는 원

이 두 원의 교점이다.

 

따라서 두 원의 위치관계에 따라 교점의 위치를 구해주면, 그게 류재명이 있을 수 있는 좌표의 개수가 된다. 

그림 출처: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=honeyeah&logNo=110140815554

 

다만, 두 원이 같은 경우(원의 중심이 같고, 반지름이 같은 경우) 류재명이 있을 수 있는 좌표는 무한대이므로 -1을 출력해주면 된다. 

 

코드

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

// y1은 변수명 에러가 나서 y_1으로 바꿈
int x1, y_1, r1, x2, y2, r2;

int main() {
    int t;
    cin >> t;
    for (int i=0; i<t; i++) {
        cin >> x1 >> y_1 >> r1 >> x2 >> y2 >> r2;
        double d = sqrt((y2-y_1)*(y2-y_1) + (x2-x1)*(x2-x1));

        int l_r = max(r1, r2);
        int s_r = min(r1, r2);
        int sum = l_r + s_r;
        int diff = l_r - s_r;

        if (y2== y_1 && x2 == x1 && r2 == r1) {
            cout << -1;
        } else if (sum < d || diff > d) {
            cout << 0;
        } else if (sum == d || diff == d) {
            cout << 1;
        } else if (diff < d && d < sum) {
            cout << 2;
        }
        cout << '\n';
    }
    return 0;
}

 

 

 

문제

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

 

1002번: 터렛

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

www.acmicpc.net