[BOJ] 1002_터렛

ProblemSolving / / 2021. 1. 17. 02:06

터렛

문제 링크: https://www.acmicpc.net/problem/1002

 

1002번: 터렛

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

www.acmicpc.net

 

문제는 그리 어렵지 않으나 세세한 조율이 필요했던 문제이다.


두 좌표와 각 좌표에서 r이 주어졌을 때

류재명이라는 점이 존재할 경우의 수를 구하는 것이다.

시작하기 전 문제를 보면 두 좌표와 r이 주어짐을 볼 수 있다.
또한 r의 자리에 존재하는 경우의 수
그렇다 두 원의 교점에 대한 문제이다.

두 원의 교점에 대해 종류를 생각해보자.

img


이미지 출저: https://mathbang.net/101

 

이를 통하여 교점의 개수는 최대 2개 임을 알 수 있다.
다만, 조심해야할 점은 무한한 점이다.
같은 좌표 상 같은 반지름을 가지는 두 원은 무한한 교점을 가지게 되므로 조심해야 한다.

그렇다면 위 이미지를 토대로 식을 정리해보자.

  • d < r + r'
    • d > r' - r : 2
    • d = r' - r : 1
    • d < r' - r : 0
  • d > r + r' : 0
  • d = r + r' : 1

이러한 식이 성립된다.

그리고 같은 좌표일 경우

  • d = 0, r = r' : 무한
  • d = 0, r != r' : 0

이를 통한 코드를 보자.

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

int length(int x1, int y1, int x2, int y2) {
    return pow(x1-x2, 2) + pow(y1-y2, 2);
}

int main() {
    int T;
    cin >> T;

    while (T--) {

        int x1, y1, r1, x2, y2, r2;
        cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;
        int l = length(x1, y1, x2, y2);
        int r = pow(r1 + r2,2);
        if (l == 0) {
            if (r1 == r2)
                cout << -1 << endl;
            else
                cout << 0 << endl;
        }
        else if (l > r)
            cout << 0 << endl;
        else if (l == r)
            cout << 1 << endl;
        else if (l < r) {
            int R = pow(r1 - r2, 2);

            if (l == R)
                cout << 1 << endl;
            else if (l < R)
                cout << 0 << endl;
            else if (l > R)
                cout << 2 << endl;
        }
    }

    return 0;
}

원래 sqrt를 통한 정확한 길이 l을 구하고자 했으나, double형으로 반환 되는 소수점 비교로 인하여 정확한 비교가 안되었다.

sqprt를 지우고 비교해주는 값들을 제곱하여 비교함으로써 정확한 비교를 할 수 있다.

'ProblemSolving' 카테고리의 다른 글

[BOJ] 1026_보물  (0) 2021.01.20
[BOJ] 1021_회전하는 큐  (0) 2021.01.19
[BOJ] 1015_수열정렬  (0) 2021.01.18
[BOJ] 1037_약수  (0) 2021.01.16
[BOJ] 1010_다리 놓기  (2) 2021.01.15
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기