본문 바로가기
Algorithm/문제 풀이 (Problem Solving)

[C++] 백준 1002번 터렛 문제풀이

by matters_ 2018. 8. 6.

문제 링크

백준 1002번 터렛

 

1002번: 터렛

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

www.acmicpc.net

 

 

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
#include <iostream>
#include <math.h>
using namespace std;
 
int main() {
    long long T=0,C=0,sr=0,br=0;
    double A=0;
    long long x1=0,x2=0,y1=0,y2=0,r1=0,r2=0;
    cin>>T;
    
    while(T!=0){
        cin>>x1>>y1>>r1>>x2>>y2>>r2;
        A=sqrt(abs(x1-x2)*abs(x1-x2)+abs(y1-y2)*abs(y1-y2));
        C=r1+r2;
        sr = r1>r2?r2:r1;
        br = r1<r2?r2:r1;
        if(A>C)cout<<0<<'\n';
        else if(A==C)cout<<1<<'\n';
        else if(C>A){
            if(r1==r2&&x1==x2&&y1==y2)cout<<-1<<'\n';
            else if(A+sr>br)cout<<2<<'\n';
            else if(A+sr==br)cout<<1<<'\n';
            else if(A+sr<br)cout<<0<<'\n';
        }
        T--;
    }
    return 0;
}
cs

 

두원과의 관계를 잘 생각하면 쉽게 풀리는 문제이다. 

 

처음 두원이 완전 떨어져있는 경우를 첫번째로 원의 두점사이의 거리와 각 원의 반지름 값의 합을 따져 계산하고

이후 두 점이 겹치는 경우는 두 원중 짧은 반지름과 두 점 사이의 거리의 합과 긴 반지름 값의 합을 따져 계산하였다.

 

 

여기서 주의할 점  

 

sqrt(n)함수는 n의 제곱근값을 반환하기 때문에 값을 받는 변수형을 double형으로 선언해주어야 한다.

이것때메 알고리즘 잘못 된 줄 알고 2시간 고민했다...

 

 

#include <math.h>

 

sqrt(n)은 n의 제곱근을 반환한다. 

abs(n)는 n의 절대값을 반환한다.

pow(n,m)은 n의 m제곱을 반환한다. 

 

댓글