Algorithm/백준

[백준] 1004 어린 왕자 with C++

nowkoes 2023. 7. 28. 14:45

문제설명


입출력 예제


개념

 이 문제는 어린 왕자가 출발점에서 목표점까지 지나가야 하는 최소 행성계의 수를 찾는 문제다. 각 행성계는 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