서두르지 말고 쉬지 말자

백준 1002번 터렛(C++) 본문

코딩 공부/Baekjoon Problem Solving

백준 1002번 터렛(C++)

philos 2024. 5. 4. 22:10

문제 해결 전략: 두 원의 위치 관계를 이용하여 문제를 푼다. 반례가 없도록 코드를 잘 짜주어야 한다.

문제 해결 소감: 오랜만에 문제를 풀어서 그런가 자잘한 오류가 있었다.

#include <iostream>
#include <cmath>

int T;
int x, y, x2, y2;
int r1, r2;
double d;
int R;
int Rminus;



int main(){
  std::cin >> T;
  
  while(T > 0){
    std::cin >> x >> y >> r1 >> x2 >> y2 >> r2;
    d = sqrt( pow((x-x2),2) + pow((y-y2),2) ); 
    R = r1 + r2;
    Rminus = abs(r1-r2);


    if(x == x2 && y == y2){//동심원이다.
      if(r1 == r2) //반지름의 길이가 같다.
        std::cout << -1 << std::endl;
      else if(r1 != r2) //반지름의 길이가 다르다.
        std::cout << 0 << std::endl;
    }
    else if(x != x2 || y != y2){ //동심원이 아니다.
      if(d > R) //두 원이 서로 만나지 않는다.
        std::cout << 0 <<std::endl;
      else if(d == R) // 두 원이 외접한다.
        std::cout << 1 <<std::endl;
      else if(d < R){ // 두 원이 서로 겹친다.
        if(Rminus < d) // 두 원이 겹쳐서 교점이 2개 생긴다.
          std::cout << 2 <<std::endl;
        else if(Rminus == d)//두 원이 내접한다.
          std::cout << 1 <<std::endl;
        else if(Rminus > d)//큰 원 안에 작은 원이 있고 둘은 만나지 않는다.
          std::cout << 0 <<std::endl;
      }
    }
    T--;
  }
  return 0;
}
반응형