본문 바로가기
  • 공부, 여행 리뷰해요~~!!
공부/C++

C++ 백준 1002번

by 하나리나 2023. 12. 25.
반응형

백준 1002번 풀이결과 공유 입니다.

 

문제

  • 조규현, 백승환, 류재명이 있다.
  • 조규현과 백승환의 좌표를 각각 (x1,y1), (x2,y2)로 제시한다.
  • 조규현과 류재명 사이의 거리인 r1과 백승환과 류재명 사이의 거리인 r2를 제시한다.
  • 류재명이 있을 수 있는 좌표의 개수를 출력한다.

문제해결

  • 그리면서 해결하면 편하다. 원과 반지름이 주어졌을 때 교점의 개수를 구하는 문제이다.
  • 원점이 같을 때,
    1) 반지름도 같을 때 (교점이 무한대)
    2) 반지름은 다를 때 (교점이 없음)
  • 원점이 다르고, 반지름의 길이가 같을 때 => 한 점에서 만남
  • 원점이 다르고, r1+r2보다 조규현~백승환 거리가 길 때 => 교점 없음
  • 원점이 다르고, r1-r2보다는 조규현~백승환 거리가 길고, r1+r2보다는 조규현~백승환 거리가 짧을 때 => 두 점에서 만남

소스코드

#include <iostream>

int main() {
    int T=0;


    int x1 = 0, x2 = 0, y1 = 0, y2 = 0, r1 = 0, r2 = 0, RR = 0, r1_minus_r2 = 0, r1_plus_r2 = 0;
    std::cin >> T;
    for (int i = 0; i < T; i++) {
        std::cin >> x1 >> y1 >> r1 >> x2 >> y2 >> r2;

        // 두 점 사이의 거리
        RR = (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);

        // 작은 원이 큰 원 안에 있을 떄를 가정 함.
        r1_minus_r2 = (r1 - r2) * (r1 - r2);
        //반대
        r1_plus_r2 = (r1 + r2) * (r1 + r2);

        if (RR == 0) // 원의 중심이 같을 때
        {
            if (r1_minus_r2 == 0) std::cout << "-1" << std::endl; // 반지름도 같을 때
            else std::cout << "0" << std::endl;
        }
        else if (RR == r1_minus_r2 || RR == r1_plus_r2) std::cout << "1" << std::endl;// 한 점에서 만남.
        else if (r1_minus_r2 < RR && RR < r1_plus_r2) std::cout << "2" << std::endl; // 두 점에서 만남
        else std::cout << "0" << std::endl; // 멀어서 만나지 않음.

    }


}
반응형