백준/백준 단계별 문제풀이

백준 1002번 (C++)

FDEE 2020. 9. 1. 14:46

www.acmicpc.net/problem/1002

 

1002번: 터렛

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

www.acmicpc.net

 

<답안>

#include <iostream>
#include <cmath>
using namespace std;
void swap(double *r1, double *r2)
{
    double temp = *r1;
    *r1 = *r2;
    *r2 = temp;
}
int main()
{
    int t;
    int x1,x2,y1,y2;
    double r1,r2;
    double distance;
    cin>>t;
    while(t-- > 0)
    {
        cin>>x1>>y1>>r1>>x2>>y2>>r2;
        distance = sqrt(pow(x1-x2,2)+pow(y1-y2,2));
        
        if(distance > r1+r2)
            cout<<0;
        else if(distance == r1+r2)
            cout<<1;
        else
        {
            if(r1 < r2)
                swap(&r1,&r2);
            
            if(distance > r1-r2)
                cout<<2;
            else if(distance != 0 && distance == r1-r2)
                cout<<1;
            else if(distance != 0 && distance < r1 - r2)
                cout<<0;
            else if(distance == 0 && r1 != r2)
                cout<<0;
            else
                cout<<-1;
        }
        cout<<"\n";
        
    }
    return 0;
}

 

<설명>

이 문제는 문제접근 방법은 쉽게 떠올랐다 두점간의 거리와 반지름간에 비교를 통해 2점인지 1점인이 안만나는지 같은 원의 경우 -1를 구하면 되겠다 정도는 쉽게 떠올랐다

하지만 경우를 쪼개는게 생각보다 쉽게풀리지만은 않았다

크게 생각했을때 7가지의 케이스가 생겼었다

 

두점의 거리를 distance 라고 하였을 때

1. if (distance > r1+r2)

-> 0, 만나지 않는 경우이다

2. if (distance == r1+r2)

-> 1, 밖에서 한점으로 만나는 경우이다

else : distance < r1+r2인 경우이다

   swap() : r1과 r2를 비교하여 큰 값을 r1으로 바꾼다

   3. if (distance > r1-r2)

   -> 2, 내부에서 두점으로 겹치는 경우이다

   4. if (distance == r1-r2)

   -> 1, 내부에서 한점으로 겹치는 경우이다

 

여기서 주의할 점은 위의 경우에 distance = 0, r1 = r2, 즉 동일한 원인 경우도 포함된다

동일원일때는 -1이 출력되어야 하기 때문에 위의 조건에서 수정이 필요하다

그래서 distance != 0 조건을 추가한다

 

   4. if (distance != 0 && distance == r1-r2)

   -> 1, 내부에서 한점으로 겹치는 경우이다

   5. if (distance != 0 && distance < r1-r2)

   -> 0, 내부에서 만나지 않는 경우이다

 

이외에 남은 두 케이스는 좌표가 동일한 경우이다

이중에 동일원인 경우(r1 == r2)와 동일하지 않는 경우(r1 != r2)로 나뉜다

 

   6. if(distance == 0 && r1 != r2)

   -> 0, 동일좌표, 동일원이 아니기에 만나지 않는 경우이다

   7. else (distance == 0 && r1 == r2)

   -> -1, 동일 원이기에 -1을 출력한다

 

각 케이스에 맞게 출력한 다음 개행하여 다음 입력을 진행한다

 

'백준 > 백준 단계별 문제풀이' 카테고리의 다른 글

백준 3053번 (C++)  (0) 2020.09.01
백준 4153번 (C++)  (0) 2020.08.30
백준 3009번 (C++)  (0) 2020.08.30
백준 1085번 (C++)  (0) 2020.08.30
백준 9020번 (C++)  (0) 2020.08.30