hello, world!

[baekJoon1004] 어린 왕자 본문

BAEKJOON/geometry

[baekJoon1004] 어린 왕자

ferozsun 2020. 8. 5. 16:53

https://www.acmicpc.net/problem/1004

 

1004번: 어린 왕자

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트케이스에 대해 첫째 줄에 출발점 (x1, y1)과 도착점 (x2, y2)이 주어진다. 두 번째 줄에는 행성계의 개수 n이 주��

www.acmicpc.net


▷ pow()

헤더파일: <cmath>

함수 원형: double pow (double base, double n)

하는 일: base가 되는 숫자의 n제곱을 반환

pow(2.2, 2);

IDEA

[모든 경우]

1. 출발점과 도착점이 모두 원 내부에 있는 경우

2. 출발점은 내부에, 도착점은 외부에 있는 경우

3. 출발점은 외부에, 도착점은 내부에 있는 경우

4. 출발점과 도착점이 모두 원 외부에 있는 경우

 

위 경우 가운데 2, 3번의 경우에만 진입/이탈 횟수가 증가한다!


▷ "점이 원 내부에 있을 경우" 계산

점의 좌표: (x, y)

원의 좌표: (a, b)

원의 반지름: r

 

(x-a)^2 + (y-b)^2 <r^2


/*
날짜: 2020.08.05
번호: 1004
문제: 각 테스트 케이스에 대해 어린 왕자가 거쳐야 할 최소의 행성계 진입/이탈 횟수를 출력한다.
*/
#include <iostream>
#include <cmath> // pow()
using namespace std;
int main() {
	int T;	cin >> T; // # of test case

	for (int i = 0; i < T; ++i) {

		int x1, y1, x2, y2; // 출발좌표, 도착좌표
		cin >> x1 >> y1 >> x2 >> y2;

		int n;	cin >> n; // 원 개수
		int x, y, r; // 원 좌표, 반지름
		int cnt = 0; // 진입/이탈 횟수

		for (int j = 0; j < n; ++j) {
			bool isSin = 0; // starting point가 원 내부에 있는지
			bool isEin = 0; // end point가 원 내부에 있는지

			cin >> x >> y >> r;

			if (pow(x1 - x, 2) + pow(y1 - y, 2) < pow(r, 2)) {
				isSin = 1;
			}
			if (pow(x2 - x, 2) + pow(y2 - y, 2) < pow(r, 2)) {
				isEin = 1;
			}

			// 점 하나는 원 내부에 다른 하나는 외부에 있을 경우 진입/이탈 발생
			if (isSin != isEin) {
				cnt++;
			}
		}

		cout << cnt << "\n";
	}
}

Comments