Bakjoon Q1002 - C++

Q1002


Problem

이석원은 조규현과 백승환에게 상대편 마린(류재명)의 위치를 계산하라는 명령을 내렸다. 조규현과 백승환은 각각 자신의 터렛 위치에서 현재 적까지의 거리를 계산했다.

조규현의 좌표 (x1, y1)와 백승환의 좌표 (x2, y2)가 주어지고, 조규현이 계산한 류재명과의 거리 r1과 백승환이 계산한 류재명과의 거리 r2가 주어졌을 때, 류재명이 있을 수 있는 좌표의 수를 출력하는 프로그램을 작성하시오.

Input

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 이루어져 있다.

한 줄에 x1, y1, r1, x2, y2, r2가 주어진다. x1, y1, x2, y2는 -10,000보다 크거나 같고, 10,000보다 작거나 같은 정수이고, r1, r2는 10,000보다 작거나 같은 자연수이다.

Output

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

예제 입력

1
2
3
4
3
0 0 13 40 0 37
0 0 3 0 7 4
1 1 1 1 1 5

예제 출력

1
2
3
2
1
0

나의 제출

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <bits/stdc++.h>

class Point{ //class definition for "Point" data type 
    public:
        int x;
        int y;
       
        Point(int input_x, int input_y){ //constructor when it creates objects "Point X"
            x = input_x;
            y = input_y;
        }
        
};

double dist(Point a1, Point a2);
int sol(double dist, int r1, int r2);

int main(){
    int n;
    scanf("%d", &n);
    while(n--){
            int x1, y1, r1, x2, y2, r2;
            scanf("%d %d %d %d %d %d", &x1, &y1, &r1, &x2, &y2, &r2);
            Point p1(x1, y1); //input of 조규현
            Point p2(x2, y2); //input of 백승환
            double D = dist(p1, p2);
            int Ans = sol(D, r1, r2);
            printf("%d\n", Ans);
        }
}

double dist(Point a1, Point a2){ //calculate distance between two points
    double X = pow((a1.x-a2.x), 2);
    double Y = pow((a1.y-a2.y), 2);
    double Z = sqrt(X+Y);
    return Z;
}

int sol(double dist, int r1, int r2){ // return results according to distance(by func "dist"), and two radius r1 & r2
    if(dist==0){ /*this is the main point of question, when two circle have same radius and same center, their cross point it infinite.*/
        if(r1==r2)
            return -1;
    }

    if(dist > (r1+r2))
        return 0;
    else if(dist == (r1+r2))
        return 1;
    else if(dist < (r1+r2)){
        if(dist > abs(r1-r2))
            return 2;
        else if(dist == abs(r1-r2))
            return 1;
        else if(dist < abs(r1-r2))
            return 0;
        else return 10; // for dummy result
    }
    else return 10; //for dummy result
}

추가 내용

문제 자체는 그렇게 어렵지 않았고, 예외 조건을 몇 가지 추가하자 실제로도 금방 풀렸다. 다만 오랜만에 class 개념을 도입해서 풀어보려 하면서 조금 풀이가 난잡해진 감이 있는 것 같다. 가장 직관적인 풀이를 위해 필요 외의 함수(dist 계산하는거나 sol 계산하는 함수)를 다 만들어서 읽기 쉽게 만들었다. 문제의 유일한? 함정은 역시 radius가 동일할때 infinite한 cross point가 생기는 것 정도인 것 같다.

총평

오랜만에 class 연습도 해보면서 겸사겸사 이것저것 시도해 볼 수 있었던 좋은 문제!