문제설명
입출력 예제
개념
이 문제는 어린 왕자가 출발점에서 목표점까지 지나가야 하는 최소 행성계의 수를 찾는 문제다. 각 행성계는 2차원 평면에서 원으로 표현된다. 이 문제를 풀기 위한 핵심 개념은 다음과 같다.
1. 원의 내부에 점이 위치하는지 확인: 이 문제를 해결하기 위해서는 주어진 점이 원 안에 있는지를 확인해야 한다. 이를 위해 거리 계산 공식을 사용하면 된다. 주어진 점 (x, y)와 원의 중심 (x1, x2) 사이의 거리는 sqrt((x-x1)^2 + (y-x2)^2)로 계산하고, 이 값이 원의 반지름 r보다 작거나 같으면 점은 원 내부에 있다.
2. 출발점과 도착점이 동일한 원에 있는 경우: 문제에서는 출발점과 도착점이 동일한 원 안에 있을 경우, 어린 왕자가 그 원을 지나가지 않고 무시할 수 있다는 사실을 명시하고 있다. 따라서, 출발점과 도착점이 동일한 원에 속하는지 확인하고, 만약 그렇다면 그 원은 카운트에서 제외해야 한다.
3. 최소 행성계 카운트: 출발점과 도착점이 각각 원에 속하는지 따로 판별한 후, 둘 다 원 안에 있지 않거나, 둘 중 하나만 원 안에 있는 경우만 카운트를 증가시키는 방식으로 최소 행성계 수를 찾는다.
풀이
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int T, x1, y1, x2, y2, cx, cy, r, n;
float distance = 0;
cin >> T;
while (T--)
{
int cnt = 0;
cin >> x1 >> y1 >> x2 >> y2;
cin >> n;
while (n--)
{
cin >> cx >> cy >> r;
distance = sqrt(pow(cx - x1, 2) + pow(cy - y1, 2));
bool start_in_circle = sqrt(pow(cx - x1, 2) + pow(cy - y1, 2)) <= r;
bool end_in_circle = sqrt(pow(cx - x2, 2) + pow(cy - y2, 2)) <= r;
if (start_in_circle != end_in_circle)
cnt++;
}
cout << cnt << "\n";
}
}
반응형
'Algorithm > 백준' 카테고리의 다른 글
[백준] 1015 수열 정렬 with C++ (0) | 2023.08.02 |
---|---|
[백준] 1013 Contact With C++ (0) | 2023.08.01 |
[백준] 1002 터렛 with C++ (0) | 2023.07.20 |
[백준] 1094 막대기 with C++ (0) | 2023.07.04 |
[백준] 14725 개미굴 with C++ (0) | 2023.06.29 |